最新の Linux セキュリティ強化戦術の 1 つは、オプションを使用してコードをコンパイルおよびリンクすることです-Wl,-z-noexecstack
。これにより、DLL またはバイナリが実行可能スタックを必要としないことが示されます。この状態は、readelf
またはその他の手段を使用して確認できます。
uClibc を使用していて、このフラグが設定されていないオブジェクト (.so ファイル) が生成されることに気付きました。しかし、uClibc には構成オプションUCLIBC_BUILD_NOEXECSTACK
があり、ヘルプによると次のようになります。
Mark all assembler files as noexecstack, which will mark uClibc
as not requiring an executable stack. (This doesn't prevent other
files you link against from claiming to need an executable stack, it
just won't cause uClibc to request it unnecessarily.)
This is a security thing to make buffer overflows harder to exploit.
...etc...
Makefile を掘り下げると、これは正しいです。フラグはアセンブラーにのみ適用されます。
フラグはアセンブラにのみ渡されるため、uClibc 開発者は重要な強化フラグを見逃しているということですか? 他のオプションがあります。たとえばUCLIBC_BUILD_RELRO
、同等のフラグがリンカーに追加されます ( as -Wl,-z,relro
)
しかし、何気ない観察者はこれを簡単に読み違え、私が最初に行ったように、UCLIBC_BUILD_NOEXECSTACK
実際には .so ファイルをマークしていないのに、実際には .so ファイルをマークしていると思い込む可能性があります。たとえば、OpenWRT は、uClibc をビルドするときにそのフラグが確実に設定されるようにします。
uClibc が「通常の」方法で物事を行わないのはなぜですか? ここで何が欠けていますか?ライブラリ (librt.so、libpthread.so など) は実際には NX ではありませんか?
編集-Wl,-z,noexecstack
Makefile をいじって、引数
を使用して noexecstack ビットを取得することができました。では、なぜ彼らもそれを使用しないのでしょうか?