
Linuxプロセスアイデンティティ偽装ツール。11フェーズのprctlパイプラインを通じてcomm、argv、cmdline、environ、exeパス、VMAを偽装し、別のプロセスになりすます。
Linuxプロセスアイデンティティの偽装
DARKCLOAKは、ユーザー空間から可視のすべてのアイデンティティソースの操作を11フェーズの逐次パイプラインに連鎖させ、プロセスを段階的に変換して、ユーザー空間の監視ツールから見てなりすまし対象のプロセスと区別がつかなくなるまで変化させます。私たちの知る限り、ユーザー空間から可視のすべてのアイデンティティソースを同時に操作することを組み合わせた公開ツールは存在しません。
完全な技術解説はRAZORブログで公開されています。
task_struct->comm: PR_SET_NAME経由argv[0]: スタックへの直接上書き経由/proc/$PID/cmdline): PR_SET_MM_ARG_START/END経由/proc/$PID/environ): PR_SET_MM_ENV_START/END経由/proc/$PID/exe): PR_SET_MM_EXE_FILE経由/proc/$PID/maps): 匿名メモリに置き換えunshare経由パイプラインは、操作対象となるカーネルサブシステム間の依存関係によって定義された厳密な順序で実行されます:
_startで補助ベクタを解析してPHTを解決し、3つのPT_LOADセグメントすべての仮想アドレス範囲を取得getresuid / getresgidで元のUIDとGIDを保存し、後で復元setresuid(0,0,0)capget/capset経由でpermittedセットをeffectiveおよびinheritableセットにコピーprctl(PR_SET_NAME) → task_struct->commを上書き[rsp+8]への直接スタック書き込み → argv[0]を上書きprctl(PR_SET_DUMPABLE, 0) → 非特権プロセスからの/proc/$PID/memアクセスとをブロックPR_SET_MM_EXE_FILEは、いずれかのVMAがまだ元のバイナリにバックアップされている間はEBUSYで失敗します。RIPが.textセグメント内にある間はそれをアンマップできないため、匿名化は一時的な匿名ページから実行されます:
mmap)mm_start→mm_end) とセグメントメタデータをそこにコピーmprotect).textを離れるPT_LOADセグメントそれぞれについて: 新しい匿名領域をmmap → セグメント内容をmemcpy → 元の領域をmunmap → 匿名コピーを元のアドレスにmremapで戻す → 元のパーミッションを復元するためmprotect.textに戻り、トランポリンページをアンマップこのバイナリはインタプリタを持たない静的ELFであるため、実行時のVMAレイアウトは完全に決定論的です: 3つのPT_LOADセグメント、スタック、カーネルvDSOです。
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
偽装対象はコンパイル時に.dataセクションで定義されます。デフォルトではsshdになりすまします:
mimic_name db 'sshd', 0
mimic_argv db './sshd', 0
mimic_exe db '/usr/sbin/sshd', 0
mimic_cmdline db '/usr/sbin/sshd', 0, '-D', 0, '[email protected]', 0, ...
mimic_environ db 'LANG=en_US.UTF-8', 0, 'NOTIFY_SOCKET=/run/systemd/notify', 0, ...
別のプロセスになりすますには、ビルド前にこれらの値を更新してください。
./darkcloak
permittedセットにCAP_SYS_RESOURCE、CAP_SETUID、CAP_SETGID、CAP_SETPCAPが必要です。CAP_SYS_RESOURCEがない場合、MM偽装ブロック (VMA匿名化 + EXE_FILEスワップ) は完全にスキップされます。CAP_SETPCAPがない場合、ツールはPR_SET_SECUREBITSからPR_SET_KEEPCAPSにフォールバックします。
./darkcloak &
PID=$!
cat /proc/$PID/comm
readlink /proc/$PID/exe
cat /proc/$PID/cmdline | tr '\0' ' '
cat /proc/$PID/environ | tr '\0' '\n' | head -3
cat /proc/$PID/maps | head -5
cat /proc/$PID/status | grep -E 'Uid|Gid|Cap'
ps aux | grep $PID
教育および研究目的のみで公開されています。自身が所有するシステム、またはテストに対する明示的な書面による許可を得たシステムでのみ使用してください。
ptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → /proc/$PID/cmdlineをリダイレクトprctl(PR_SET_MM_ENV_START/END) → /proc/$PID/environをリダイレクトprctl(PR_SET_MM_EXE_FILE) → mm_struct->exe_fileを置き換えPR_SET_SECUREBITS (CAP_SETPCAPがある場合) またはPR_SET_KEEPCAPS (フォールバック)setresuid(1000,1000,1000)または元の値を復元setresgid(1000,1000,1000)または元の値を復元unshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s)の後exit