/tmp et /var/log en noexec sur macOS  >  2018 , Cyber-sécurité , Défendre et protéger







Afin de durcir son système d'exploitation UNIX-like, il est recommandé que /tmp et /var/log ne soit pas exécutable. Voici comment faire sous macOS en mettant en mémoire vive ces points de montage.





Il faudra créer un fichier qui devra se charger au démarrage, par exemple : /Library/LaunchDaemons/org.secureinfo.ramfs.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Disabled</key>
  <false/>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>org.iunix.ramfs</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/libexec/ramfs-helper</string>
  </array>
</dict>
</plist>







Voici le script qui est appelé par le service, qui aura pour but de vérifier en boucle, que les points de montage soit effectif. Tant que ça n'est pas le cas, leur montage sera tenté tout les secondes (sleep 1)

Pour installer le script au bon endroit (cf. /Library/LaunchDaemons/org.secureinfo.ramfs.plist)


sudo mkdir -p /usr/local/libexec/
sudo nano /usr/local/libexec/ramfs-helper
sudo chmod 755 /usr/local/libexec/ramfs-helper
 

#!/bin/sh
 
# 2048000 = 1 Go
# 1024000 = 512 Mo
#  512000 = 256 Mo
#  128000 = 64  Mo
#   64000 = 32  Mo
#   32000 = 16  Mo
 
LOG="/var/log/ramfs.log"
 
while true ; do
 
  /sbin/mount|/usr/bin/grep -E "/private/var/log|/private/tmp"|/usr/bin/wc -l|/usr/bin/grep 2 && break
 
  /sbin/mount|/usr/bin/grep "/private/tmp" >/dev/null 2>&1 || 
   /usr/local/bin/ramfs 1024000 /private/tmp nosuid,nodev,nobrowse,noexec Temp 1777 >>  2>&1
 
  /sbin/mount|/usr/bin/grep "/private/var/log" >/dev/null 2>&1 || 
   /usr/local/bin/ramfs 1024000 /private/var/log nosuid,nodev,nobrowse,noexec VarLog 0755 >>  2>&1
 
  sleep 1
 
done
 
 
if [ "$*" = "-q" ]; then
  /usr/bin/true
  exit 0
fi
 
/bin/sleep 600
 







Le code permettant de créer le disque virtuel en mémoire et de le monter sur le chemin fourni, avec les droits associés.


sudo mkdir -p /usr/local/bin/
sudo nano /usr/local/bin/ramfs
sudo chmod 755 /usr/local/bin/ramfs
 

#!/bin/bash
 
#########################################################################################
#
# ramfs - secureinfo.eu - make a temporary folder in RAM
#
#########################################################################################
 
 
## Variables ############################################################################
 
# Log for this script
LOG="/var/log/$(basename $0).log"
 
NAME="RAM"
MOUNT="/ram"
MODE=0755
 
SIZE=4160000 # 4160000 : 2Go
             # 2080000 : 1Go
             # 1040000 : 512 Mo
             #  570000 : 256 Mo
             #  385000 : 128 Mo
             #  197500 :  64 Mo
 
OPTIONS="noexec,nosuid,nodev,nobrowse"
 
[ ! -z $1 ] && SIZE="$1"
[ ! -z $2 ] && MOUNT="$2"
[ ! -z $3 ] && OPTIONS="$3"
[ ! -z $4 ] && NAME="$4"
[ ! -z $5 ] && MODE="$5"
 
 
## Functions ############################################################################
 
function create_ram_point()
{
  # Get args
  MP="$1"
  RIGHTS_MP="$2"
  OWNER_MP="$3"
  SZ_DST="$4"
  OPTION_MP="$5"
 
  # Prepare log
  /usr/bin/printf "
 
$(date) - RAMfs started [$MP : $SZ_DST]
" >> "$LOG"
  /bin/date >> "$LOG"
 
  # Already created & mounted
  /sbin/mount|grep "$MP" >> "$LOG" && return
 
  # Prepare folder
  /bin/mkdir -v -p $MP >> "$LOG"
 
  # Create new device...
  dev=`/usr/sbin/hdik -drivekey system-image=yes -nomount ram://$SZ_DST` >> "$LOG"
  echo "RAMfs device : $dev" >> "$LOG"
 
  # ...then initialize and mount
  if [ ! -z "$dev" ] ; then
    # Create HFS on the RAM volume.
    /bin/sync ; /sbin/newfs_hfs $dev >> "$LOG"
 
    # Mount the RAM disk to the target mount point.
    /sbin/mount -v -t hfs -o union -o $OPTION_MP $dev $MP >> "$LOG"
 
    # Set owner/group to uid 0 (root/wheel)
    /usr/sbin/chown -v $OWNER_MP $MP >> "$LOG"
  fi
 
  # Check if all is OK
  /sbin/mount -v |grep "$MP" >> "$LOG"
 
  # If hide from user
  if echo "$OPTION_MP"|grep -sq "nobrowse" ; then
    /usr/bin/chflags hidden "$MP"
  fi
 
  # New rights
  /bin/chmod -v $RIGHTS_MP "$MP" >> "$LOG"
}
 
 
## Script ###############################################################################
 
FOUND=0 ; diskutil list|grep -wsq "$NAME" && FOUND=1
 
echo $NAME
 
if [ $FOUND -eq 0 ] ; then
 
  create_ram_point "$MOUNT" $MODE root:wheel $SIZE $OPTIONS
 
else
 
  disk="$(diskutil list|grep "$NAME"|head -n1|/usr/bin/egrep -io "diskd+")"
  mkdir -p "$MOUNT"
  echo $disk
  /sbin/mount -v -t hfs -o union -o $OPTIONS /dev/$disk "$MOUNT" >> "$LOG"
  chmod $MODE $MOUNT
 
fi
 
diskutil rename "$MOUNT" "$NAME"
 
# End of log
/usr/bin/printf "
 
$(date) - RAMfs finished
" >> "$LOG"
 



   =>   Écrit par : Nicolas, le 12 octobre 2018


 
Mots clés :  
  security 
  
  macos 
  
  system 
    >   Articles connexes :

Durcissement de Windows

Durcissement de Windows



Comment gagner du temps sur Internet

Comment gagner du temps sur Internet


4737633