ทำไม strace / gdb จะไม่แนบกับกระบวนการแม้ว่าฉันจะเป็น root หรือไม่


26
  • ฉันเข้าสู่ระบบในฐานะ root แต่straceให้สิ่งนี้กับฉัน:

    root @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 แต้ม / 2 00:00:00 111
     3810 pts / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    แนบ: ptrace (PTRACE_ATTACH, ... ): ไม่อนุญาตให้ใช้งาน
    ไม่สามารถแนบกับกระบวนการ หาก uid ของคุณตรงกับ uid ของเป้าหมาย
    ให้ตรวจสอบการตั้งค่า / proc / sys / kernel / yama / ptrace_scope หรือลอง
    อีกครั้งในฐานะผู้ใช้รูท สำหรับรายละเอียดเพิ่มเติมดู /etc/sysctl.d/10-ptrace.conf
    ราก @ kyznecov-System: / home / kyznecov
    
    root @ kyznecov- ระบบ: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0
  • จากนั้นฉันพยายามใช้gdbเพื่อดีบักโปรแกรมหลายกระบวนการใน Eclipse CDT ด้วยการฟอร์กและทำให้ฉันได้ผลลัพธ์ / ข้อผิดพลาดเหมือนกัน:

    ป้อนคำอธิบายรูปภาพที่นี่

ความคิดใด ๆ


เนื่องจาก ptrace_scope มีค่าเป็นศูนย์จึงไม่สำคัญ แต่ในการทดลองคุณสามารถลองใช้ strace ได้ง่ายขึ้นโดยที่กระบวนการติดตามเป็นกระบวนการหลักที่ติดตาม เช่นstrace /bin/echo test? นั่นเป็นข้อความแสดงข้อผิดพลาดเดียวกันหรือไม่?
Jordan Uggla

@EliahKagan ในทางทฤษฎีสิ่งที่ OP อธิบายไม่สามารถเกิดขึ้นได้หากไม่มีเคอร์เนลบั๊ก หากคุณมีเวลาในอีก 24 ชั่วโมงข้างหน้าและสามารถเปลี่ยนความคิดเห็นของคุณให้เป็นคำตอบนั่นคงจะดีมาก - การทดสอบของฉันใน Precise ไม่พบปัญหาใด ๆ และด้วยวิธีนี้มันจะเป็นคำตอบที่ชัดเจนว่ามีบางเรื่องแปลก ในการกำหนดค่าของ OP ... เขาไม่ได้กลับมาตั้งแต่คำถามเริ่มต้นเมื่อวันที่ 29 พฤษภาคม
ish

@EliahKagan สิ่งหนึ่งที่เพิ่งตีฉันในการอ่าน "การดำเนินการที่ไม่ได้รับอนุญาต" บิต - เพราะฉันเคยเห็นมาก่อนหลายครั้งเมื่อฉันควรจะรูตบน OpenVZ VPS / VMs (พวกเขาแบ่งปันเคอร์เนลเครื่องโฮสต์ดังนั้นไม่ คุณเป็นเพียงราชาแห่งเกาะเล็ก ๆ ของคุณ) ... อาจเป็นกรณีนี้หรือ ดูวางนี้
ish

@izx การวางของคุณหมดอายุแล้ว และฉันมีปัญหานี้ (ภายในตู้คอนเทนเนอร์) ความเข้าใจใด ๆ ก็ดี
Kunal Tyagi

คำตอบ:


25

สาเหตุหนึ่งที่ทำให้เกิดข้อผิดพลาด:

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

เป็นเพราะกระบวนการที่ได้รับแล้วแนบไปกับgdb, straceหรือคล้ายกัน ในการตรวจสอบว่าเป็นกรณีนี้หรือไม่ให้เรียกใช้:

grep TracerPid /proc/$THE_PID/status

ถ้าไม่ใช่ศูนย์นั่นคือ pid ของโปรแกรมที่มีอยู่ซึ่งกำลังรันการติดตามบนกระบวนการนั้นอยู่แล้ว


เราไม่ได้สังเกตสิ่งนี้หากเราทำการดีบั๊กใน Eclipse ... ซึ่งกำลังใช้ GDB อยู่แล้ว
ernesto

ขอบคุณที่ชี้นำสิ่งนี้ ฉันกำลังเรียกใช้โปรแกรมผ่านโปรแกรมตัดคำ โปรแกรมจะทำการค้นหาแล้วดำเนินการเอง เด็กที่ถูกตรวจสอบจะตายอย่างรวดเร็วในขณะที่รัน strace wrapper ซึ่งล้มเหลวในการแนบเนื่องจากกระบวนการพาเรนต์อยู่ภายใต้การควบคุมของ strace
Rob Kennedy

18

ตามที่izxแสดงความคิดเห็นสิ่งนี้ควรเกิดขึ้นได้เนื่องจากเคอร์เนลบั๊ก ดังนั้นทุกคนที่อยู่ในปัจจุบันสามารถผลิตปัญหานี้ - รวมและโดยเฉพาะอย่างยิ่งโปสเตอร์เดิมของคำถามนี้ - จะดีควรที่จะรายงานว่าเป็นข้อผิดพลาดจากการอ่านหน้านั้นอย่างละเอียดและรอบคอบแล้วทำงานubuntu-bug linuxบนเครื่องได้รับผลกระทบ สิ่งนี้ควรได้รับการรายงานlinuxใน Ubuntu และไม่ใช่กับเคอร์เนลการฉีด (อัปสตรีม) เว้นแต่คุณจะสามารถสร้างขึ้นบนเคอร์เนลการฉีดได้ (คุณต้องyamaโหลด)

พฤติกรรมที่คาดหวังในอูบุนตูทุกรุ่นที่เริ่มต้นด้วย Ubuntu 10.10 คือกระบวนการ A ไม่สามารถติดตามกระบวนการที่กำลังรัน B ยกเว้นว่า B เป็นลูกโดยตรงของ A (หรือ A วิ่งตามroot) นี่คือการปรับปรุงความปลอดภัยซึ่งทำให้กระบวนการที่ถูกโจมตีโดยผู้โจมตีไม่สามารถใช้สิ่งอำนวยความสะดวกในการตรวจแก้จุดบกพร่องที่จัดเตรียมโดยเคอร์เนลเพื่อค้นหาข้อมูลจากกระบวนการอื่น นี่คือคำอธิบายในขอบเขต ptraceส่วนของคุณลักษณะด้านความปลอดภัยหน้าวิกิพีเดียชุมชน

พฤติกรรมที่ จำกัด นี้เป็นค่าเริ่มต้น แต่สามารถเปลี่ยนแปลงได้เพื่อให้กระบวนการ A สามารถติดตามกระบวนการที่กำลังรัน B ที่รันด้วย ID ผู้ใช้เดียวกันกับกระบวนการของ A นั่นคือคุณสามารถกำหนดค่าระบบของคุณเพื่อให้กระบวนการใด ๆ ของคุณเพื่อดีบักซึ่งกันและกัน สิ่งนี้จะช่วยให้การแนบ debuggers ง่ายขึ้นกับกระบวนการที่รันอยู่แล้ว

การตั้งค่าสำหรับการนี้ได้รับการเปิดเผยในโดยsysctl/proc/sys/kernel/yama/ptrace_scope 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

ไม่เพียง แต่เป็นโปสเตอร์เดิมของคำถามนี้ไม่สามารถแนบstraceอินสแตนซ์ที่จะเป็นกระบวนการที่ทำงานอยู่ในปัจจุบันกับptrace-scopeชุด0แต่โปสเตอร์เดิมแล้วก็ยังไม่สามารถทำเช่นนั้นเมื่อทำงานเป็นstrace rootเป็นการยากที่จะดูว่าสิ่งนี้อาจเป็นอะไรได้นอกจากเป็นข้อบกพร่อง - ฉันขอแนะนำให้รายงานเป็นข้อผิดพลาด

ตอนแรกผมคิดว่าผมสามารถที่จะทำให้เกิดปัญหาที่ptrace_scopeการตั้งค่าจะถูกละเว้นและปฏิบัติราวกับว่ามันเป็น0 1แต่ฉันไม่เชื่อในกรณีนี้อีกต่อไปเพราะฉันได้ทำสิ่งเดียวกันทั้งหมดอีกครั้งและฉันไม่สามารถสร้างปัญหาขึ้นมาอีกได้ ฉันได้ทดสอบสิ่งนี้เมื่อ:

  • เครื่องกายภาพ Lubuntu แม่นยำ amd64 ฉันใช้ทุกวันเป็นกล่องหลักของฉัน
  • เครื่องเสมือน VirtualBox ที่ใช้งาน Lub Lub Precise i386 (12.04) ซีดีสด
  • เครื่องเสมือน VirtualBox ที่เหมือนกันซึ่งใช้ Quantal i386 (Ubuntu + 1) ทุกวันสด (20120608)

ในทั้งสามเครื่องพฤติกรรมที่คาดไว้เกิดขึ้นและฉันไม่สามารถทำซ้ำเงื่อนไขที่ผู้ลงประกาศดั้งเดิมของคำถามนี้ถาม นี่คือข้อความจากเทอร์มินัล (จากระบบถ่ายทอดสดที่แม่นยำ):

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สร้างผลลัพธ์เพียงไม่กี่ผลซึ่งไม่มีรายงานใดที่ชัดเจนสำหรับข้อบกพร่องนี้ การรายงานข้อผิดพลาดจะช่วยผู้อื่นอาจนำไปสู่การแก้ไขปัญหาหรือการแก้ไขและอาจเป็นวิธีเดียวที่มีความหมายในการดำเนินการแก้ไขปัญหานี้ต่อไป (สมมติว่าปัญหายังคงเกิดขึ้น)


ขอบคุณสำหรับคำแนะนำที่ฉันจะอ่านในรายละเอียดในวันพรุ่งนี้และอาจจะเพิ่มหัวเรื่องย่อยบางส่วน แต่ผมคิดว่านี่เป็นอย่างมาก :)
ish

ในโพสต์ของฉันคุณสามารถดู: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 ฉันทำแล้ว: echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz

ในการประสานทั้งหมดทำงานได้อย่างง่ายดาย แต่ถ้าฉันรันโปรแกรมใน eclipse และลอง strace จาก console ฉันจะได้รับปัญหาดังกล่าว
andreykyz

2
อาจเป็นผลข้างเคียงของกระบวนการที่ถูกติดตามอยู่แล้ว? ฉันมีปัญหาเดียวกันเมื่อใช้ gdb ในกระบวนการผู้ปกครองกับ child-allow-mode
Jamie Pate

2
ฉันได้รับข้อผิดพลาดนี้เช่นกันใน 14.04 ไม่มีใครทราบว่ามีการรายงานข้อผิดพลาดหรือไม่
Detly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.