diff --git a/src/experimental/asan_cgroups/limit_memory.sh b/src/experimental/asan_cgroups/limit_memory.sh index 9ee378c..4dec01e 100644 --- a/src/experimental/asan_cgroups/limit_memory.sh +++ b/src/experimental/asan_cgroups/limit_memory.sh @@ -33,24 +33,31 @@ # task. # +# 输出脚本的作者信息 echo "cgroup tool for afl-fuzz by and " echo +# 清除NEW_USER变量的值 unset NEW_USER +# 设置默认内存限制为50MB MEM_LIMIT="50" +# 解析命令行参数 while getopts "+u:m:" opt; do case "$opt" in + # -u 参数用于指定运行fuzzer的用户 "u") NEW_USER="$OPTARG" ;; + # -m 参数用于设置内存限制,单位为MB "m") - MEM_LIMIT="$[OPTARG]" + MEM_LIMIT="$OPTARG" ;; + # 如果遇到未知参数,退出脚本 "?") exit 1 ;; @@ -59,17 +66,22 @@ while getopts "+u:m:" opt; do done +# 检查内存限制是否低于安全阈值 if [ "$MEM_LIMIT" -lt "5" ]; then echo "[-] Error: malformed or dangerously low value of -m." 1>&2 exit 1 fi +# 移除已解析的选项,保留fuzz命令 shift $((OPTIND-1)) +# 获取目标二进制文件路径 TARGET_BIN="$1" +# 检查是否提供了必要的参数 if [ "$TARGET_BIN" = "" -o "$NEW_USER" = "" ]; then + # 输出使用说明 cat 1>&2 <<_EOF_ Usage: $0 [ options ] -- /path/to/afl-fuzz [ ...afl options... ] @@ -89,75 +101,81 @@ conjunction with '-m none' passed to the afl-fuzz binary itself, say: _EOF_ + # 因为缺少必要的参数,退出脚本 exit 1 fi -# Basic sanity checks - +# 基本的系统检查 +# 检查是否为Linux系统 if [ ! "`uname -s`" = "Linux" ]; then echo "[-] Error: this tool does not support non-Linux systems." 1>&2 exit 1 fi +# 检查是否以root用户运行脚本 if [ ! "`id -u`" = "0" ]; then echo "[-] Error: you need to run this script as root (sorry!)." 1>&2 exit 1 fi +# 检查是否安装了cgroup工具 if ! type cgcreate 2>/dev/null 1>&2; then echo "[-] Error: you need to install cgroup tools first." 1>&2 + # 根据包管理器提供安装命令建议 if type apt-get 2>/dev/null 1>&2; then echo " (Perhaps 'apt-get install cgroup-bin' will work.)" 1>&2 elif type yum 2>/dev/null 1>&2; then echo " (Perhaps 'yum install libcgroup-tools' will work.)" 1>&2 fi + # 因为缺少必要的工具,退出脚本 exit 1 fi +# 检查指定的用户是否存在 if ! id -u "$NEW_USER" 2>/dev/null 1>&2; then echo "[-] Error: user '$NEW_USER' does not seem to exist." 1>&2 exit 1 fi -# Create a new cgroup path if necessary... We used PID-keyed groups to keep -# parallel afl-fuzz tasks separate from each other. - -CID="afl-$NEW_USER-$$" +# 创建一个新的cgroup路径(如果必要),使用PID键值组来确保并行的afl-fuzz任务相互独立 +CID="afl-$NEW_USER-$" CPATH="/sys/fs/cgroup/memory/$CID" +# 如果路径不存在,则创建cgroup if [ ! -d "$CPATH" ]; then cgcreate -a "$NEW_USER" -g memory:"$CID" || exit 1 fi -# Set the appropriate limit... - +# 设置内存限制 +# 如果系统支持交换空间限制,则同时设置内存和交换空间限制 if [ -f "$CPATH/memory.memsw.limit_in_bytes" ]; then echo "${MEM_LIMIT}M" > "$CPATH/memory.limit_in_bytes" 2>/dev/null echo "${MEM_LIMIT}M" > "$CPATH/memory.memsw.limit_in_bytes" || exit 1 - echo "${MEM_LIMIT}M" > "$CPATH/memory.limit_in_bytes" || exit 1 +# 如果系统有启用交换空间,则要求先禁用交换空间 elif grep -qE 'partition|file' /proc/swaps; then echo "[-] Error: your system requires swap to be disabled first (swapoff -a)." 1>&2 exit 1 +# 如果系统不支持交换空间限制,则仅设置内存限制 else echo "${MEM_LIMIT}M" > "$CPATH/memory.limit_in_bytes" || exit 1 fi -# All right. At this point, we can just run the command. - +# 运行fuzz命令,并确保其在设置的cgroup内存限制下执行 cgexec -g "memory:$CID" su -c "$*" "$NEW_USER" +# 删除cgroup以清理资源 cgdelete -g "memory:$CID"