ELFバイナリのINTERPセクションのset-uidと相対パスの組み合わせは非常に危険です。set-uidとELFのINTERP(ダイナミックリンカ)の相対パスのセキュリティ上の問題
私がどこでどのようにこの問題を報告しなければならない非常にわからないんだけど、それは、Linux/glibcの作品にどのように動的リンクに関する一般的なセキュリティ上の問題のように私には思われるので、私はそれが何であるかを説明しましょう:
ダイナミックにリンクされたバイナリを構築し、ELF INTERPセクションで--dynamic-linker gccオプションを使用して相対パスを指定することを考慮して、ダイナミックにリンクされた商用アプリケーションを使用してカスタムglibcバージョンを再配布できるようにしてくださいLGPL glibcに対して静的には動作しますが、glibcのバージョンが異なる別のLinuxディストリビューションでバイナリ作業を行う必要があります)。
バイナリにルートを設定し、バイナリにset-uidフラグを設定すると、効果的にルートキットになります。それを別のディレクトリから実行するときに、実行可能な動的リンカを置き換えることができます。実行可能ファイルはroot権限で実行されます。これを実証するために
、次のCコード(issue.c)を見てみましょう:
#include <stdio.h>
//
// build with:
// gcc -DNAME=\"vulnarable\" -o issue -Wl,--dynamic-linker,.lib64/ld-linux-x86-64.so.2 issue.c
// sudo chown root issue
// sudo chmod u+s issue
// now build some code to be executed with root permissions (we use the same issue.c):
// mkdir -p .lib64/
// gcc -DNAME=\"rootkit\" -o .lib64/ld-linux-x86-64.so.2 --static issue.c
//
int main(int argc, char* argv[])
{
printf("(%s) euid:%d\n", NAME, geteuid());
}
あなたは今、この
./issue
あるいは単にのようなセットのuidバイナリを実行した場合例えば、この
ldd issue
を行う代わりに、あなたが期待するかもしれないものを得る:
(vulnarable) euid:0
は、あなたが得る:
(rootkit) euid:0
今ポイントは、あなたが好きで、LD-linuxの-x86-64.so.6バイナリを置き換えることができます。
RPATHで$ ORIGINを解決しないか、またはset-uidフラグが設定されている場合はLD_LIBRARY_PATHを無視して、同様の問題が解決されているようです。
set-uidフラグが設定されているときはいつでも(つまり、デフォルトのダイナミックリンカ - /lib32/ld-linux.so.2または/ lib64/ld- linux-x86-64.so.2)?
だから、glibcやカーネルで、これをどこで修正したり報告したりすればよいと思いますか?
あなたは 'sudo'を使ってルートアクセスを得る方法を提案しています。つまり、ルートアクセスが必要です。 – ugoren
どのカーネルとディストリビューションでこれをテストしましたか?私はUbuntu 10.04でカーネル2.6.32-38-genericを使用して問題を再現するのに問題があります:setuidプログラムで期待される '(./issue)euid:0'だけです。 –
@ugoren:そうではありません。脆弱性が本物であると仮定すると、攻撃者は脆弱なsetuidプログラムを見つけることが必要です。命令の中の 'sudo'コマンドは、それを作成するためだけにあり、問題を実証することができます。 –