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.
0x01. SERVICE
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>
0x02. /usr/local/libexec/ramfs-helper
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
0x03. /usr/local/bin/ramfs
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