web-dev-qa-db-ja.com

ルートであるにもかかわらず、プロセスにstrace / gdbが接続しないのはなぜですか?

  • Rootとしてログインしましたが、straceから次のことがわかります。

    root @ kyznecov-System:/ home/kyznecov#ps -e | grep 111 
     3807 pts/2 00:00:00 111 
     3810 pts/2 00:00:00 111 
     root @ kyznecov-System:/ home/kyznecov#strace- p 3810 
     
     attach:ptrace(PTRACE_ATTACH、...):操作は許可されていません
    プロセスに接続できませんでした。 uidがターゲット
    プロセスのuidと一致する場合、/ proc/sys/kernel/yama/ptrace_scopeの設定を確認するか、rootユーザーとしてもう一度
    を試してください。詳細については、/ etc/sysctl.d/10-ptrace.conf 
     root @ kyznecov-System:/ home/kyznecov 
     
     root @ kyznecov-System:/ homeを参照してください。/kyznecov#cat /proc/sys/kernel/yama/ptrace_scope
    0
  • その後、gdbを使用して、フォークを使用してEclipse CDTのマルチプロセスプログラムをデバッグしようとしましたが、同じ結果/エラーが発生しました。

    enter image description here

何か案は?

26
andreykyz

エラーが発生する1つの理由:

attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

これは、プロセスがgdbstraceなどで既にアタッチされているためです。これが当てはまるかどうかを確認するには、次を実行します。

grep TracerPid /proc/$THE_PID/status

ゼロ以外の場合、それはそのプロセスで既にトレースを実行している既存のプログラムのpidです。

25
Nathan Kidd

izx がコメントしているように、これはカーネルのバグが原因でのみ発生するはずです。したがって、この問題を現在発生させることができる人は誰でも、特にこの質問の元のポスターを含めて、 バグとして報告する を読むことをお勧めします。そのページを徹底的に慎重に検討し、影響を受けるマシンでubuntu-bug linuxを実行します。これは、Ubuntuのlinuxに対して報告する必要があり、メインライン(上流)カーネルに対してnot報告する必要があります。 yamaがロードされています)。

Ubuntu 10.10以降のUbuntuのすべてのバージョンで予想される動作は、BがAの直接の子でない限り、プロセスAが実行中のプロセスBをトレースできないことです(またはAはrootとして実行されます)。これはセキュリティの強化であり、攻撃者によって侵害されたプロセスは、カーネルが提供するデバッグ機能を使用して他のプロセスから情報を発見できないようにします。これは、セキュリティ機能コミュニティwikiページの ptrace scopeセクション で説明されています。

この制限的な動作はデフォルトですが、プロセスAがプロセスA自身と同じユーザーIDで実行されている実行中のプロセスBをトレースできるように変更できます。つまり、プロセスを相互にデバッグできるようにシステムを構成できます。これにより、すでに実行中のプロセスにデバッガーを簡単に接続できます。

この設定は、/proc/sys/kernel/yama/ptrace_scopesysctl で公開されます。 1はより制限の厳しい動作を示し、0はより制限の少ない動作を示します。設定は次の方法で読み取ることができます。

cat /proc/sys/kernel/yama/ptrace_scope

制限の少ない(デフォルトではない)動作は、次のように設定できます。

echo 0 | Sudo tee /proc/sys/kernel/yama/ptrace_scope

そして、より制限的な(デフォルトの)動作は次のように設定(または元に戻す)できます:

echo 1 | Sudo tee /proc/sys/kernel/yama/ptrace_scope

この質問の元の投稿者は、ptrace-scope0に設定して現在実行中のプロセスにstraceインスタンスを添付できなかっただけでなく、 straceとしてrootを実行しています。これがバグではないことを確認するのは困難です。バグとして報告することを強くお勧めします。

最初は、ptrace_scope0設定が無視され、1のように扱われるという問題を再現できると考えていました。しかし、私はすべて同じことを再び行ったため、これが事実であるとはもはや信じていません。問題を再現できません。私はこれをテストしました:

  • メインボックスとして毎日使用するLubuntu Precise AMD64物理マシン。
  • Lubuntu Precise i386(12.04)ライブCDを実行しているVirtualBox仮想マシン。
  • Quantal i386(Ubuntu + 1)を毎日実行している同一のVirtualBox仮想マシン(20120608)。

3台すべてのマシンで、予想される動作が発生し、この質問の元のポスターが尋ねている状態を再現できません。ターミナル(正確なライブシステム)からのテキストを次に示します。

lubuntu@lubuntu:~$ nano&
[1] 3492
lubuntu@lubuntu:~$ strace -p 3492
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

[1]+  Stopped                 nano
lubuntu@lubuntu:~$ cat /proc/sys/kernel/yama/ptrace_scope
1
lubuntu@lubuntu:~$ echo 0 | Sudo tee /proc/sys/kernel/yama/ptrace_scope
0
lubuntu@lubuntu:~$ strace -p 3492
Process 3492 attached - interrupt to quit
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---

straceは、期待どおりに中断するまでメッセージの生成を続けました。

最後に、これをバグとして報告することを再度お勧めします。 https://bugs.launchpad.net (報告されたUbuntuのバグを含む)でptrace_scopeというテキストを最大限に包括的に検索すると、 ほんの一握りの結果、明らかにこのバグの報告はありません 。バグを報告することは他の人を助け、回避策または修正につながる可能性があり、おそらくこの問題に取り組む前に進む意味のある唯一の方法です(問題がまだ発生していると仮定)。

18
Eliah Kagan