2012-01-26 7 views
6

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やカーネルで、これをどこで修正したり報告したりすればよいと思いますか?

+0

あなたは 'sudo'を使ってルートアクセスを得る方法を提案しています。つまり、ルートアクセスが必要です。 – ugoren

+0

どのカーネルとディストリビューションでこれをテストしましたか?私はUbuntu 10.04でカーネル2.6.32-38-genericを使用して問題を再現するのに問題があります:setuidプログラムで期待される '(./issue)euid:0'だけです。 –

+0

@ugoren:そうではありません。脆弱性が本物であると仮定すると、攻撃者は脆弱なsetuidプログラムを見つけることが必要です。命令の中の 'sudo'コマンドは、それを作成するためだけにあり、問題を実証することができます。 –

答えて

5

はい、安全でない場所に通訳者を指定するsetuidバイナリを持つことは安全ではありません(相対パスは指定できますが、ワールドライト可能な固定パスには同じ問題があります)。しかし、それはELFデザインの論理的な結論であり、setuidバイナリのためのINTERPの処理に特殊なケースを追加することは、方法ではありません。 の場合 "医者、これをすると痛いです。 - しないでください。 "はい、この組み合わせは安全ではないので、単に使用しないでください!とにかくELF通訳の介入はむしろ進んでいるので、あなたが何をしているのか分からない限り、それをするべきではありません。その場合、安全かどうかを論理的に結論づけることができます。

ELF/POSIX/Unix /その他の高度な機能は、強力なので、足で自分を撃つ強力な方法を提供します。起こり得るすべての状況を取り除きたい場合は、システムに柔軟性がなく、プログラムするのがはるかに難しく、その中にいくつかの穴が残っています。

+0

合意。 setuidプログラムで絶対パスではないコマンドを使って 'system()'を呼び出すようなものです。プログラムでlibcのカスタムバージョンを使用したい場合は、それを行うために相対的なINTERPを使用しないでください。代わりに静的にリンクするだけです。 LGPLは一般的に許可しています。 – Dolda2000

+0

@ F'x:いい答えですが、set-uidフラグをどこに置いても慎重であることに同意しますが、引数はELFのRPATH/RUNPATHまたはLD_LIBRARY_PATH env varにも当てはまります - この場合(set-uid flag )、RPATH/RUNPATHとLD_LIBRARY_PATHはすべて一緒に無視されます。ではなぜINTERPを無視しないのですか? – siddhadev

+2

LD_LIBRARY_PATHには適用されません。これは、実行可能ファイルの作成者ではなくユーザーが設定できるためです。何かがあれば、RUNPATHは本当に扱われるのが奇妙だと思います。 – Dolda2000

関連する問題