2012-04-15 2 views
1

root(r00t_ではない)として実行する必要があるのはなぜですか?ptrace PTRACE_ATTACHの失敗 - ユーザー所有プロセスのLinuxパーミッション

// main() 
scan.scanProcessOffset(10838, 0x7f8c14000000); // proper pid and offset 

void MemoryMapper::scanProcessOffset(unsigned int procId, unsigned long long offset) 
{ 
    long attach = ptrace(PTRACE_ATTACH, procId, NULL, NULL); 
    cout << attach << endl << errno << endl; 

    long memory = ptrace(PTRACE_PEEKDATA, procId, offset); 
    if (memory == -1 && errno == 3) 
    { 
     cout << errno << endl; 
     errno = 0; 
    } 

    cout << memory; 
} 

私はrootとして実行r00t_

[email protected]:/proc/10838$ ls -l 
lrwxrwxrwx 1 r00t r00t_ 0 2012-04-15 08:21 exe -> /usr/bin/gedit 
-rw------- 1 r00t r00t_ 0 2012-04-15 09:04 mem 

出力ないによって所有さに引っ掛けてる過程見ることができるようにします。rootとして

[email protected]:~/memedit$ ./a.out 
-1 
1 
3 
-1 

出力:

[email protected]:~/memedit$ sudo ./a.out 
0 
0 
140239607693344 

なぜ私は私がアタッチしようとしているプロセスのオーナーですか?

+0

あなたはUbuntuを使用していますか? –

+0

はい私はubuntu 11.10 –

答えて

4

いくつかのアプリケーションは、具体的PTRACE_ATTACH(例えばssh-agentの)許可しないようにprctl()を使用し、Yamaに実装され、より一般的な解決策が唯一の子プロセスに親から直接ptraceを可能にしている間(すなわち、直接gdbstraceまだ動作)、 (つまり、gdb BIN PIDstrace -p PIDはまだrootとして動作しています)。 ローカルのアプリケーションが侵害された場合、攻撃者は他のプロセスに接続してそのメモリと実行状態を検査することができません。

この動作は、/proc/sys/kernel/yama/ptrace_scope sysctl値によって制御されます。子供以外のptraceコールをブロックするには、デフォルトは "1"です。 「0」の値はより許容される振る舞いを復元します。これは開発システムや管理者アカウントのみを持つサーバーに適しています。 sudoを使用すると、機能を使用してptrace権限を一時的に付与することもできますが、この方法では任意のプロセスのptraceが許可されます。

+0

を使用していますので、一般的にrootレベルのprivelagesが必要なように思えます。これは、さまざまな種類のアプリケーションにフックできるようにするためです。それが必要な理由についての洞察に感謝します。 –

関連する問題