web-dev-qa-db-ja.com

patchelf 0.6および0.8を使用してld-linux-x86-64.so.2でRUNPATHを設定した後、bashをchrootできません

動的リンクがRUNPATH変数でどのように機能するかをテストし、最小限のbashディレクトリでchrootを実行しようとしています。

$ find dir_chroot/ -type f
dir_chroot/bin/bash
dir_chroot/lib/x86_64-linux-gnu/libc.so.6
dir_chroot/lib/x86_64-linux-gnu/libdl.so.2
dir_chroot/lib/x86_64-linux-gnu/libtinfo.so.5
dir_chroot/lib64/ld-linux-x86-64.so.2

-これらはすべてbashの依存関係であり、実際のバイナリ(find -type f)であり、シンボリックリンクではありません。また、彼らはRUNPATHを持っていません:

$ find dir_chroot/ -type f -exec sh -c "readelf -d {} | grep RUNPATH" \;
$ 

chrootは、次のディレクトリで正常に機能します。

$ Sudo chroot dir_chroot /bin/bash
bash-4.3# exit
exit

ただし、すべてをコピーして$Origin/RUNPATHlib64/ld-linux-x86-64.so.2に設定すると、segfaultの実行時に終了コード139chroot?)が返されます。

$ cp -R dir_chroot dir_chroot4
$ find dir_chroot4/ -type f -exec sh -c "echo {} `readelf -d {} | grep RUNPATH`" \; 
dir_chroot4/bin/bash
dir_chroot4/lib/x86_64-linux-gnu/libc.so.6
dir_chroot4/lib/x86_64-linux-gnu/libdl.so.2
dir_chroot4/lib/x86_64-linux-gnu/libtinfo.so.5
dir_chroot4/lib64/ld-linux-x86-64.so.2
$
$ patchelf --set-rpath "\$Origin/" dir_chroot4/lib64/ld-linux-x86-64.so.2
$ find dir_chroot4/ -type f -exec sh -c "echo {} `readelf -d {} | grep RUNPATH`" \; 
dir_chroot4/bin/bash
dir_chroot4/lib/x86_64-linux-gnu/libc.so.6
dir_chroot4/lib/x86_64-linux-gnu/libdl.so.2
dir_chroot4/lib/x86_64-linux-gnu/libtinfo.so.5
dir_chroot4/lib64/ld-linux-x86-64.so.2 0x000000000000001d (RUNPATH) Library runpath: [$Origin/]
$
$ Sudo chroot dir_chroot4 /bin/bash
$
$ echo $status
139

--$statusは、fishシェルのステータス変数です。

これは、ld-linux-x86-64.so.2にパッチが適用され、他のライブラリとbash実行可能ファイルがRUNPATHで正常に機能する場合にのみ発生します。なぜそうなのですか?

1
xealits

どうやら、ld-linux-x86-64.so.2は静的にリンクされており、少なくとも私のシステム上にあります。

>ldd ld-linux-x86-64.so.2
statically linked

libc.so.6libdl.so.2およびlibtinfo.so.5とは異なります

>ldd libc.so.6 libdl.so.2 libtinfo.so.5

libc.so.6:
/lib64/ld-linux-x86-64.so.2 (0x000056469847a000)
linux-vdso.so.1 =>  (0x00007ffe95185000)

libdl.so.2:
linux-vdso.so.1 =>  (0x00007fffc4718000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa1df136000)
/lib64/ld-linux-x86-64.so.2 (0x0000558334a9c000)

libtinfo.so.5:
linux-vdso.so.1 =>  (0x00007ffe1b7bd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffa990b9000)
/lib64/ld-linux-x86-64.so.2 (0x00005590bfced000)

これにより、ローダーが狂ってしまい、強制的に[〜#〜] runpath [〜#〜]を挿入すると、セグメンテーション違反が発生します。

1
zeppelin