
Userland exec PoC to be used as attack vector technique
ユーザーランド exec は、現在のアドレス空間内の既存のプロセスイメージを新しいものに置き換えます。これはシステムコール execve の動作を模倣しますが、プロセスイメージを記述するプロセス構造は変更されません。言い換えれば、システムユーティリティが報告するプロセス名は、古いプロセス名のままになります。
この手法は、任意のコード実行を獲得した後にステルス性を達成するために使用できます。また、noexec パーティションに保存されたバイナリを実行するためにも使用できます。
最初のユーザーランド exec は grugq によって作成されました。このリポジトリは、この手法の包括的なブログ解説を含む Rapid7 Mettle ライブラリ から強く影響を受けています。
当初、このリポジトリのコードの大部分は Mettle ライブラリを模倣していましたが、その後、SELinux の検証をバイパスするための追加の複雑さを含むように拡張されました。
SELinux には execmem 検証が含まれており、以下を保証します:
mprotect を使用して PROT_WRITE から PROT_EXEC に変更することは禁止されています)。mprotect のバイパスmprotect をバイパスするには、一時ファイルを作成する必要があります。これは memfd_create を munmap および mmap と組み合わせることで実現でき、mprotect システムコールを完全に回避します。
elf_debugger.c の例は、任意の ELF に実行可能かつ書き込み可能な PT_LOAD 領域が含まれていることを示しています。この領域は、実行中にプログラム情報を読み込むために必要です。これに対処するため、bypass_wx.c の実装が作成されました。この設計は:
SIGSEGV シグナルをトリガーします。PROT_EXEC から PROT_WRITE に動的に変更します。このセクションでは、Android および x86 マシン向けのビルド方法について説明します。作業を進める前に libelf がインストールされていることを確認してください。
mkdir build && cd build
cmake ..
make
desktop % strace ./uexec hello others args here 2>&1 | grep exec
execve("./uexec", ["./uexec", "hello", "others", "args", "here"], 0x7ffc34ec02f0 /* 54 vars */) = 0
desktop % strace bash -c ./hello 2>&1 | grep exec
execve("/usr/bin/bash", ["bash", "-c", "./hello"], 0x7ffebecc3130 /* 54 vars */) = 0
newfstatat(AT_FDCWD, "/desktop/userland-exec/build", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
newfstatat(AT_FDCWD, "/desktop/userland-exec", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
execve("./hello", ["./hello"], 0x5fb22658e2a0 /* 54 vars */) = 0
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-30 ..
make
desktop % adb push uexec hello /data/local/tmp
uexec: 1 file pushed, 0 skipped. 113.9 MB/s (22912 bytes in 0.000s)
hello: 1 file pushed, 0 skipped. 184.9 MB/s (6936 bytes in 0.000s)
2 files pushed, 0 skipped. 0.3 MB/s (29848 bytes in 0.090s)
desktop % adb shell
dm3q:/ $ cd /data/local/tmp
dm3q:/data/local/tmp $ chmod +x uexec
dm3q:/data/local/tmp $ ./hello
Hello World
dm3q:/data/local/tmp $ ./uexec hello
Hello World
dm3q:/data/local/tmp $
CentOS では、libc ライブラリが異常な動作を示す場合があります。この問題に対処するため、アセンブリで書かれた単純な "Hello, World" プログラムである hello_nolibc.s が提供されています。この例は cmake とともに、libc にリンクせずにプログラムをビルドして実行する方法を示しています。
CMAKE が 4.0 より上の場合は、ビルドに -DCMAKE_POLICY_VERSION_MINIMUM=3.5 を追加できます。
このリポジトリは GPL-3.0 ライセンス を使用しています。
| OS | Architect | Result |
|---|
| Ubuntu 24.04 | x86_64 | 成功 |
| Archlinux 6.12.4 | x86_64 | 成功 |
| CentOS | x86_64 | 成功 |
| Raspberry Pi OS | arm64 | 成功 |
| S23 Android 14 | arm64 | 成功 |