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


26
  • 私はルートとしてログインしましたが、これ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のマルチプロセスプログラムをデバッグしようとしましたが、同じ結果/エラーが発生しました。

    ここに画像の説明を入力してください

何か案は?


ptrace_scopeはゼロなので問題ではありませんが、実験のように、トレースプロセスがトレースされるプロセスの親であるstraceのより単純な使用を試すことができます。例えばstrace /bin/echo test?同じエラーメッセージが表示されますか?
ジョーダンウグラ

@EliahKagan、理論的には、カーネルのバグがないと OPが説明したことは起こり得ません。次の24時間かそこらに時間があり、コメントを回答に変えることができる場合、それは素晴らしいことです-Preciseでの私のテストでは問題は明らかになりませんでした。 OPの設定で...彼は5月29日の最初の質問以来戻っていません。
ish12年

@EliahKagan、「操作が許可されていない」ビットを再読み込みすると、私にヒットしました-OpenVZ VPS / VMにルートていると思われる(ホストマシンのカーネルを共有しているので、 、あなたはあなた自身の小さな島の王だけです)...多分これは事実でしたか?参照してください。このペースト
っぽい

@izxペーストの有効期限が切れました。そして、私は(コンテナ内)この問題を持って、任意の洞察力がいいだろう
クナルティアギ(Tyagi)

回答:


25

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

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

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

grep TracerPid /proc/$THE_PID/status

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


私たちはEclipseでデバッグしている場合我々はこのことを気づかない...すでにGDBを使用している
エルネスト・

これを指摘してくれてありがとう。私はstraceラッパーを介してプログラムを実行していました。プログラムは分岐してから、それ自体を実行します。実行された子は、straceラッパーを実行するとすぐに死にます。親プロセスは既にstraceの制御下にあるため、アタッチに失敗します。
ロブ・ケネディ

18

以下のようizxはコメントしている、これが唯一のカーネルのバグが原因起こることができるはずです。そのため、現在この問題(特にこの質問の元のポスターを含む)を作成できる人はそのページを注意深く読みubuntu-bug linux、影響を受けるマシンで実行することでバグとして報告することをお勧めします。これは、メインラインカーネル(ロードする必要がある)で生成できない限り、メインライン(アップストリーム)カーネルに対してではなくlinux、Ubuntu に対して報告する必要があります。yama

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

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

この設定は/proc/sys/kernel/yama/ptrace_scope sysctlによって公開されます。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

この質問の元のポスターはstraceptrace-scopesetを使用して現在実行中のプロセスにインスタンスを添付0できなかっただけでなく、straceとして実行しているときに元のポスターをまだ添付できませんでしたroot。これがバグではないことを確認するのは困難です。バグとして報告することを強くお勧めします。

最初は、のptrace_scope設定0が無視され、のように扱われる問題を再現できると思っていました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を最大限に検索すると、ほんの一握りの結果が得られますが、明らかにこのバグの報告はありません。バグを報告することは他の人を助け、回避策または修正につながる可能性があり、おそらくこの問題の作業を進めるための唯一の意味のある方法です(問題がまだ発生していると仮定)。


提案のおかげで、私は明日詳細にそれを読むと、おそらくいくつかの小見出しを追加し、私はこれは非常に徹底した:)だと思います
っぽい

私の投稿で見ることができます:root @ kyznecov-System:/ home / kyznecov#cat / proc / sys / kernel / yama / ptrace_scope 0私はそれをしました:echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz

concoleでは、すべてが簡単に機能します。しかし、Eclipseでプログラムを実行し、コンソールからstraceを実行すると、問題が発生します。
-andreykyz

2
すでにトレースされているプロセスの副作用かもしれませんか?許可・フォーク・モード・子供と親プロセスにGDBを使用したとき、私は同じ問題を抱えていた
ジェイミー・パテ

2
14.04でもこのバグが発生しています。バグが報告されたことがあるかどうか誰もが知っていますか?
確実に14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.