実行中のプロセスのPIDにGDBを接続する際の権限エラー

実行中のプロセスのPIDにGDBを接続する際の権限エラー

このようなおもちゃC ++プログラムがあります

#include <iostream>
int main() {
    int n{};
    std::cin >> n; // waits for input
    std::cout << n << std::endl;
}

コメント付きの行の実行中に一時停止し、ユーザー入力を待ち、デバッガを接続するのに必要なすべての時間を提供します。

ある端末でこのプログラムを実行し、別の端末に入力します。

gdb -p $(pidof that-executable)

目的は、上記のソースコードでコンパイルされた実行可能ファイルにデバッガを関連付けることです。

ただし、試してみると、次のエラーが発生します。

GNU gdb (GDB) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
Attaching to process 1086551
ptrace: Operation not permitted.

答え1

gdbgdbこれは、攻撃者が実行できる操作(ユーザー環境のピアプロセスから秘密鍵を盗んだり変更したりするなど)を考慮すると、セキュリティ上の理由からブロックされる可能性があります。その結果、最新のオペレーティングシステムでは、gdbアクセスできる項目が制限されることがよくあります。

最善のアプローチは、gdbプロセスに接続するよりも下でプログラムを実行することです。これは設定が難しいかもしれませんが、通常はデフォルトで許可されています。

それ以外の場合は設定値(/proc/sys/kernel/yama/ptrace_scope例:Linux、またはOpenBSDのsysctl)を使用して、アクセスが許可される項目をkern.global_ptrace調整します。または、次のようにgdb実行すると他の問題が発生する可能性があります。または、Linuxのコンテナに最初にこの機能を付与する必要があるかもしれません。呼び出されたプロセスは追跡するのが難しい場合があります。gdbrootSYS_PTRACEprctl(PR_SET_DUMPABLE...)

Linuxでは、selinuxやその他のセキュリティフレームワークによって操作が失敗する可能性があります。緩く設定してみてください。

答え2

2つの可能な解決策(一時的な解決策と恒久的な解決策)が説明されています。以下は、AskUbuntuに対する同様の(同じではなくても)質問に対する答えです。

この部分一時機能を使用したプログラムの実行存在するArchLinux Wiki代替ソリューションが提供されます。

最初のリンクの一時的な解決策と2番目のリンクの解決策をテストしました。彼らはすべて動作します。

正しいアプローチが何であるかわからないので、私も同じです。ArchLinuxフォーラムにお問い合わせください

関連情報