# zpoline
zpoline は、x86-64 の `syscall`/`sysenter` を二バイトの `callq *%rax` へ置換し、仮想アドレス 0 に配置したトランポリンを経由して任意のシステムコールフックへ制御を移す機構である。
起動前にメモリ上のユーザープログラムを走査して書き換えるため、ソースコード、実行ファイル、カーネル、追加カーネルモジュールを変更せずにシステムコールを網羅的に捕捉できる。(Source: [[@2023__USENIX-ATC__zpoline - a system call hook mechanism based on binary rewriting]] §2)
## 設計上の特徴
- `rax` のシステムコール番号をトランポリンの仮想アドレスとして再利用する二バイト置換
- `libzpoline.so` と `zpoline_loader` による動的リンク・静的リンク双方への適用
- `dlmopen` の名前空間分離によるフック関数の無限再帰回避
- XOM とビットマップによる仮想アドレス 0 の NULL 読み書き・実行終了
- Linux、FreeBSD、NetBSD、DragonFly BSD での動作確認
## 評価
`getpid` のフック時間は 41 ns で、`ptrace` の 31,201 ns、`int3 signaling` の 1,342 ns、SUD の 1,156 nsを下回った。
lwIP/DPDK 上の単純 HTTP サーバーと Redis では、最小オーバーヘッドの `LD_PRELOAD` に対する性能低下が 5.2%にとどまった。(Source: [[@2023__USENIX-ATC__zpoline - a system call hook mechanism based on binary rewriting]] §3.2–§3.3)
## 関連
- [[システムコールフック]]
- [[バイナリ書き換え]]
- [[ユーザーレベルTCPスタック]]
- [[カーネルバイパスネットワーキング]]
- [[Kenichi Yasukata]]
- [zpoline source repository](https://github.com/yasukata/zpoline)