2done.org

Linuxメインなメモ書き。二度寝してから書く。(ご意見は Twitter あたりで。そのうちコメント欄つけます。)

SystemTap のバグ

 

SystemTap にバグがあるよ。ということで試しました。

情報元

 

環境

 

回避方法

 

実行: SELinux Disabled または ユーザのラベルが unconfined_u の場合

SELinux なし または ユーザのラベルが unconfined_u だった場合

$ id
uid=500(staff) gid=500(staff) groups=500(staff) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ ./explout.sh
sh-4.1# id
uid=0(root) gid=0(root) groups=0(root),500(staff) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

 

さっくり、root が取れました。運用中のサーバのパスワードを忘れた時は staprun を実行するだけで回避できますね!なんてことはしないでください。また、管理外のサーバにこのようなことは決して行わないようにしてください。

何かしらのバグでリモートからログインされてしまった場合などは危険そうです。

 

実行(2): SELinux Enforcing かつ ユーザのラベル設定されている場合

ユーザが guest_u, user_u, staff_u などだった場合はアクセスが拒否されます。

$id
uid=501(guest) gid=501(guest) groups=501(guest) context=guest_u:guest_r:guest_t:s0
$ ./explout.sh
/bin/grep: /proc/kallsyms: Permission denied
FATAL: Failed to open config file exploit.conf: Permission denied
ERROR: Unable to canonicalize path "/usr/share/systemtap/runtime/uprobes/uprobes.ko": No such file or directory
$

 

権限が足らず、はじかれました。

/var/log/audit/audit.log には次のように出ています。

type=AVC msg=audit(1299452186.306:74): avc:  denied  { setuid } for  pid=1022 comm="staprun" capability=7  scontext=guest_u:guest_r:guest_t:s0 tcontext=guest_u:guest_r:guest_t:s0 tclass=capability
type=SYSCALL msg=audit(1299452186.306:74): arch=40000003 syscall=208 success=yes exit=0 a0=1f5 a1=1f5 a2=1f5 a3=d0 items=0 ppid=1021 pid=1022 auid=501 uid=501 gid=501 euid=501 suid=501 fsuid=501 egid=501 sgid=501 fsgid=501 tty=pts0 ses=3 comm="staprun" exe="/usr/bin/staprun" subj=guest_u:guest_r:guest_t:s0 key=(null)
type=AVC msg=audit(1299452186.370:75): avc:  denied  { setuid } for  pid=1023 comm="staprun" capability=7  scontext=guest_u:guest_r:guest_t:s0 tcontext=guest_u:guest_r:guest_t:s0 tclass=capability
type=SYSCALL msg=audit(1299452186.370:75): arch=40000003 syscall=208 success=yes exit=0 a0=0 a1=0 a2=0 a3=d0 items=0 ppid=1021 pid=1023 auid=501 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=3 comm="staprun" exe="/usr/bin/staprun" subj=guest_u:guest_r:guest_t:s0 key=(null)
type=AVC msg=audit(1299452186.400:76): avc:  denied  { dac_override } for  pid=1023 comm="modprobe" capability=1  scontext=guest_u:guest_r:guest_t:s0 tcontext=guest_u:guest_r:guest_t:s0 tclass=capability
type=AVC msg=audit(1299452186.400:76): avc:  denied  { dac_read_search } for  pid=1023 comm="modprobe" capability=2  scontext=guest_u:guest_r:guest_t:s0 tcontext=guest_u:guest_r:guest_t:s0 tclass=capability
type=SYSCALL msg=audit(1299452186.400:76): arch=40000003 syscall=5 success=no exit=-13 a0=8c5000b a1=98800 a2=0 a3=bfe99893 items=0 ppid=1021 pid=1023 auid=501 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=3 comm="modprobe" exe="/sbin/modprobe" subj=guest_u:guest_r:guest_t:s0 key=(null)
type=AVC msg=audit(1299452186.405:77): avc:  denied  { dac_override } for  pid=1023 comm="modprobe" capability=1  scontext=guest_u:guest_r:guest_t:s0 tcontext=guest_u:guest_r:guest_t:s0 tclass=capability
type=AVC msg=audit(1299452186.405:77): avc:  denied  { dac_read_search } for  pid=1023 comm="modprobe" capability=2  scontext=guest_u:guest_r:guest_t:s0 tcontext=guest_u:guest_r:guest_t:s0 tclass=capability
type=SYSCALL msg=audit(1299452186.405:77): arch=40000003 syscall=5 success=no exit=-13 a0=8c5000b a1=0 a2=1b6 a3=805bba9 items=0 ppid=1021 pid=1023 auid=501 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=3 comm="modprobe" exe="/sbin/modprobe" subj=guest_u:guest_r:guest_t:s0 key=(null)

 

guest_u が POSIX Capability CAP_SETUID を許可されず弾かれ、その後さらに   CAP_DAC_OVERRIDE(ファイルの読込み、書き込みと実行権限のチェック)と CAP_DAC_SEARCH(ファイルの読み込みと実行権限のチェック)が拒否されています。

# Permissive にしてみると、その後ファイルオープンなどさまざまな箇所で拒否のログが出力されていました。

 

こういう未知のバグがある場合は SELinux は強いですね。無論、SELinux にバグがなければの話ですが。

CAP_DAC_READ_SEARCHそ