Tại sao sẽ không strace / gdb gắn vào một quy trình mặc dù tôi đã root?


26
  • Tôi đã đăng nhập bằng root nhưng stracecung cấp cho tôi cái này:

    root @ kyznecov-Hệ thống: / home / kyznecov # ps -e | grep 111
     3807 điểm / 2 00:00:00 111
     3810 điểm / 2 00:00:00 111
    root @ kyznecov-Hệ thống: / home / kyznecov # strace -p 3810
    
    đính kèm: ptrace (PTRACE_ATTACH, ...): Không được phép thao tác
    Không thể đính kèm để xử lý. Nếu uid của bạn phù hợp với uid của mục tiêu
    xử lý, kiểm tra cài đặt của / Proc / sys / kernel / yama / ptrace_scope hoặc thử
    lại là người dùng root. Để biết thêm chi tiết, xem /etc/sysctl.d/10-ptrace.conf
    root @ kyznecov-Hệ thống: / nhà / kyznecov
    
    root @ kyznecov-Hệ thống: / home / kyznecov # cat / Proc / sys / kernel / yama / ptrace_scope
    0
  • Sau đó, tôi đã cố gắng sử dụng gdbđể gỡ lỗi một chương trình đa xử lý trong CDT của Eclipse bằng cách giả mạo và nó đã cho tôi kết quả / lỗi tương tự:

    nhập mô tả hình ảnh ở đây

Có ý kiến ​​gì không?


Vì ptrace_scope bằng 0 nên không có vấn đề gì, nhưng cũng giống như một thử nghiệm, bạn có thể thử sử dụng một bước đơn giản hơn, trong đó quá trình theo dõi là cha mẹ của quá trình được theo dõi. Ví dụ strace /bin/echo test? Điều đó có đưa ra thông báo lỗi tương tự không?
Jordan Uggla

@EliahKagan, theo lý thuyết, những gì OP mô tả không thể xảy ra trong trường hợp không có lỗi kernel. Nếu bạn có một chút thời gian trong 24 giờ tới và có thể biến nhận xét của bạn thành câu trả lời, điều đó thật tuyệt - thử nghiệm của tôi trên Precise đã cho thấy không có vấn đề gì, và theo cách này, đó sẽ là một câu trả lời dứt khoát rằng có một số câu đố trong cấu hình của OP ... anh vẫn chưa trở lại kể từ khi câu hỏi ban đầu của mình vào ngày 29.
ish

@EliahKagan, Một điều khiến tôi phải đọc lại bit "hoạt động không được phép" - bởi vì tôi đã thấy nó trước hàng tấn lần khi tôi được cho là đã root trên OpenVZ VPS / VM (họ chia sẻ kernel máy chủ, nên không , bạn chỉ là vua của hòn đảo nhỏ của riêng bạn) ... có lẽ đây là trường hợp? Xem dán này
ish

@izx Dán của bạn đã hết hạn. Và tôi có vấn đề này (bên trong một container), bất kỳ cái nhìn sâu sắc nào cũng sẽ tốt đẹp
Kunal Tyagi

Câu trả lời:


25

Một lý do để nhận được lỗi:

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

là bởi vì quá trình đã được gắn liền với gdb, stracehoặc tương tự. Để kiểm tra xem đây có phải là trường hợp không, hãy chạy:

grep TracerPid /proc/$THE_PID/status

Nếu nó là khác không, đó là mấu chốt của một chương trình hiện có đang chạy một dấu vết trên quy trình đó.


Chúng tôi không nhận thấy điều này nếu chúng tôi đang gỡ lỗi trong Eclipse ... hiện đang sử dụng GDB
ernesto

Cảm ơn đã chỉ ra điều này. Tôi đã chạy một chương trình thông qua một trình bao bọc strace. Chương trình rẽ nhánh và sau đó thực hiện chính nó. Đứa trẻ bị bỏ rơi nhanh chóng chết khi nó chạy trình bao bọc strace, không thể đính kèm vì quá trình cha mẹ đã nằm dưới sự kiểm soát của strace.
Rob Kennedy

18

Như izx đã nhận xét, điều này chỉ có thể xảy ra do lỗi kernel. Vì vậy, bất cứ ai hiện có thể tạo ra vấn đề này - bao gồm và đặc biệt là poster gốc của câu hỏi này - sẽ được khuyên nên báo cáo đó là một lỗi bằng cách đọc kỹ trang đó và cẩn thận, sau đó chạy ubuntu-bug linuxtrên máy bị ảnh hưởng . Điều này nên được báo cáo linuxtrong Ubuntu và không phải với hạt nhân chính (ngược dòng), trừ khi bạn có thể sản xuất nó trên hạt nhân chính (bạn phải yamatải).

Hành vi dự kiến ​​trong mọi phiên bản Ubuntu bắt đầu với Ubuntu 10.10 là quá trình A không thể theo dõi tiến trình B đang chạy trừ khi B là con trực tiếp của A (hoặc A chạy như root). Đây là một cải tiến bảo mật, giúp cho một quá trình bị kẻ tấn công xâm phạm không thể sử dụng các phương tiện gỡ lỗi do kernel cung cấp để khám phá thông tin từ các tiến trình khác. Điều này được giải thích trong phần phạm vi ptrace của trang wiki cộng đồng Tính năng bảo mật .

Hành vi hạn chế này là mặc định nhưng có thể được thay đổi để cho phép một quy trình A theo dõi bất kỳ quy trình B đang chạy nào được chạy với cùng ID người dùng như của chính quy trình A. Đó là, bạn có thể định cấu hình hệ thống của mình để cho phép bất kỳ quy trình nào của bạn gỡ lỗi lẫn nhau. Điều này đơn giản hóa việc gắn trình gỡ lỗi vào các quy trình đã chạy.

Các thiết lập cho điều này được hiển thị trong /proc/sys/kernel/yama/ptrace_scope sysctl . 1biểu thị hành vi hạn chế hơn và 0hành vi hạn chế hơn. Có thể đọc cài đặt bằng:

cat /proc/sys/kernel/yama/ptrace_scope

Hành vi ít hạn chế hơn (không mặc định) có thể được đặt bằng:

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

Và hành vi hạn chế (mặc định) hơn có thể được đặt (hoặc đặt lại) với:

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

Không chỉ người đăng ban đầu của câu hỏi này không thể đính kèm một stracethể hiện vào một quy trình hiện đang chạy với ptrace-scopethiết lập 0, mà người đăng ban đầu sau đó vẫn không thể làm như vậy khi chạy stracenhư root. Thật khó để thấy làm thế nào điều này có thể là bất cứ điều gì ngoại trừ một lỗi - tôi thực sự khuyên bạn nên báo cáo nó như là một.

Lúc đầu, tôi đã nghĩ rằng tôi có thể tái tạo vấn đề trong đó một ptrace_scopethiết lập 0bị bỏ qua và xử lý như thể nó là như vậy 1. Nhưng tôi không còn tin đây là trường hợp nữa, vì tôi đã làm lại tất cả những điều tương tự và tôi không thể tái tạo vấn đề. Tôi đã thử nghiệm điều này trên:

  • Máy vật lý Lubd Precise amd64 tôi sử dụng hàng ngày làm hộp chính.
  • Một máy ảo VirtualBox chạy CD trực tiếp Lubfox Precise i386 (12.04).
  • Một máy ảo VirtualBox giống hệt nhau đang chạy Quantal i386 (Ubuntu + 1) hàng ngày (20120608).

Trên cả ba máy, hành vi dự kiến ​​sẽ xảy ra và tôi không thể tái tạo điều kiện mà áp phích ban đầu của câu hỏi này được hỏi về. Dưới đây là một số văn bản từ Terminal (từ hệ thống trực tiếp chính xác):

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 tiếp tục tạo tin nhắn cho đến khi tôi đình chỉ nó, như mong đợi.

Tôi kết luận bằng cách đề nghị một lần nữa để báo cáo đây là một lỗi. Một tìm kiếm bao gồm tối đa trên https://bugs.launchpad.net (bao gồm bất kỳ lỗi Ubuntu nào được báo cáo) cho văn bản chỉptrace_scope tạo ra một số ít kết quả, trong đó rõ ràng không có báo cáo nào cho lỗi này . Báo cáo lỗi sẽ giúp người khác, có thể dẫn đến cách giải quyết hoặc khắc phục và có lẽ là cách duy nhất có ý nghĩa để tiếp tục xử lý vấn đề này (giả sử sự cố vẫn đang xảy ra).


Cảm ơn đã gợi ý, tôi sẽ đọc nó một cách chi tiết vào ngày mai và có thể thêm một số phân nhóm, nhưng tôi nghĩ rằng đây là cực kỳ kỹ lưỡng :)
ish

trong bài viết của tôi, bạn có thể thấy: root @ kyznecov-System: / home / kyznecov # cat / Proc / sys / kernel / yama / ptrace_scope 0 Tôi đã làm điều đó: echo 0 | sudo tee / Proc / sys / kernel / yama / ptrace_scope
andreykyz

Trong concole tất cả các công việc dễ dàng. Nhưng nếu tôi chạy chương trình trong nhật thực và thử strace từ console thì tôi gặp vấn đề.
andreykyz

2
có thể là một tác dụng phụ của quá trình đã được truy tìm? Tôi gặp vấn đề tương tự khi sử dụng gdb trong quy trình cha mẹ với con ở chế độ cho phép rẽ nhánh
Jamie Pate

2
Tôi cũng gặp lỗi này vào ngày 14.04. Có ai biết nếu một lỗi đã từng được báo cáo cho nó?
gièm pha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.