私は学校でDirty CoWの研究をしています(それが何であるかわからず、実装が私の問題に関連している可能性があると思う場合は、以下のPSを参照してください。)。
いくつかの解決策が見つかりました(例:https://github.com/scumjr/dirtycow-vdso)Dirty CoWを使用して、一部のシェルコードをvDSOに注入します。リンクのソリューションはデスクトップLinux用ですが、Android用のソリューションもあります(いくつかの変更を除いては基本的に同じです)。
既存のソリューションを分析しようとしましたが、質問がありました。 vDSOはAndroidにどこに保存されていますか?
マニュアルページ(http://man7.org/linux/man-pages/man7/vdso.7.html)は、次のようにファイルを見つけることができると言います。
find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'
Ubuntu 64ビット()で同様のコマンドを実行すると、find / -name '*vdso*' -o -name '*gate*.*so'
出力に次の行が表示されます。
/lib/modules/4.13.0-32-generic/vdso
/lib/modules/4.13.0-32-generic/vdso/vdsox32.so
/lib/modules/4.13.0-32-generic/vdso/vdso32.so
/lib/modules/4.13.0-32-generic/vdso/vdso64.so
/lib/modules/4.13.0-21-generic/vdso
/lib/modules/4.13.0-21-generic/vdso/vdsox32.so
/lib/modules/4.13.0-21-generic/vdso/vdso32.so
/lib/modules/4.13.0-21-generic/vdso/vdso64.so
objdump
これらのいずれかを使用することで、hexdump
私はそれがメモリにマップされていることがわかります(私はそれを見つけてファイルにダンプするプログラムを書いています)。
しかし、私が走るとき
adb root
adb shell find -name '*vdso*' -o -name '*gate*.so*'
私のAndroid 4.4-r4 x86で唯一の出力は/proc/sys/vm/vdso_enabled
で、ファイルの内容はです1
。
私はプロセスメモリにvDSOがあることを知っており、そのためにADBで実行されるダンププログラムを作成しました。また、私のシェルコードをvDSOに挿入するためにDirty CoWの脆弱性を調整しました。私が書いたアプリケーションと前述のゴミ箱からシェルコードがvDSOにあることがわかります。私のシェルコードは、デバイスを再起動するまでvDSOにのみ存在します。
vDSOはAndroidでどのように機能しますか?保存するファイルはありますか?そうではないようです。なぜなら、そこにいたら、再起動後にも挿入されたコードがそこにあったからです。しかし、シェルコードはどのように他のプロセスに伝播されますか?
ご回答ありがとうございます。
添付:Dirty CoWは、2つのスレッド間で競合状態を発生させ、読み取り専用ファイル(またはメモリにマップできるすべてのファイル)に書き込むことができるLinuxカーネルの脆弱性です。最初のスレッドには、テキスト書き込みを実行するループがあります。メモリに(正しい場所を見つけるために使用またはproc/self/mem
使用する)もう1つは、メモリの同じ部分が不要になったことをシステム(ループでも)に通知することです(使用)。ptrace
mmap
madvise(MADV_DONTNEED)
ベストアンサー1
これ仮想DSOディスク上の別々のファイルには保存されず、カーネルの一部であり、カーネルによって各プロセスのアドレス空間にマップされます。見つかったファイルは.so
デバッグ目的でのみ使用されます。ドキュメントのコマンドは、カーネルをビルドした例で作成されたvDSOをカーネルビルドツリーで検索します。別々のsが表示されたり、問題の別の場所はfind
必要ありません。.so
/lib/modules
あなたが扱っているエクスプロイトは、メモリにvDSOのコピーが1つしかないので伝播されるシェルコードを注入するので、これへの書き込みはvDSOの現在および将来のすべてのプロセスマップに表示されます。