2

(r00t_ではなく)rootとして実行する必要があるのはなぜですか?

// 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;
}

ご覧のとおり、私がフックしているプロセスはr00t_が所有しています。

r00t_@:/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

ルートとして実行されていない出力:

r00t_@:~/memedit$ ./a.out
-1
1
3
-1

ルートとして出力:

r00t_@:~/memedit$ sudo ./a.out
0
0
140239607693344

アタッチしようとしているプロセスの所有者であるのに、なぜアタッチできないのですか?

4

1 に答える 1

6

一部のアプリケーションはprctl()特に許可しないために使用しますがPTRACE_ATTACH(例:ssh-agent)、Yamaptraceで実装されるより一般的なソリューションは、親から子プロセスに直接許可する(つまり、直接gdbかつstrace引き続き機能する)か、rootユーザーとしてのみ許可する(つまりgdb BIN PIDstrace -p PIDまだrootとして機能します)。ローカルアプリが侵害された場合、攻撃者は他のプロセスに接続して、それらのメモリと実行状態を検査することができなくなります。

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

于 2012-04-15T16:32:11.683 に答える