'rm -rf /' สามารถลบไฟล์ทั้งหมดในระบบได้อย่างไร?


81

ฉันไม่ได้ลองคำสั่งนี้บน Ubuntu (ด้วยเหตุผลที่ชัดเจน) ดังนั้นฉันจึงไม่แน่ใจว่า Ubuntu จะอนุญาตให้ใช้หรือไม่ แต่มันมีชื่อเสียงในการลบทุกอย่าง เพิ่งเกิดจากความอยากรู้เกิดอะไรขึ้นเมื่อเคอร์เนลและ/binถูกลบไป? จะrmรักษาสแต็คเวลาทำงานอย่างไร จะrmจัดการเพื่อสื่อสารกับระบบไฟล์และลบอย่างสมบูรณ์ได้อย่างไร? มันสื่อสารกับฮาร์ดแวร์ได้อย่างไร


18
rm -rf /--no-preserve-rootไม่ได้ลบอะไรโดยไม่
muru

47
ประสบการณ์ครั้งแรกของฉันกับ Linux คือการสร้าง Ubuntu vm เพื่อให้ฉันสามารถ "rm -rf /" ได้ ฉันแนะนำให้คุณลองทำดู มันค่อนข้างรวดเร็วในการตั้งค่ามันช่วยให้โฮสต์ของคุณปลอดภัยและสนุกสนานมากในการดูส่วนต่าง ๆ ของระบบปฏิบัติการที่ล้มลงต่อหน้าต่อตา พอใจมาก
DJMcMayhem

21
เตือนฉันถึงรายงานข้อผิดพลาด understated ที่ฉันโปรดปราน: bugzilla.redhat.com/show_bug.cgi?id=1202858 "ผลลัพธ์ที่คาดหวัง: Squid เริ่มต้นใหม่ผลลัพธ์ที่แท้จริง: ไฟล์ทั้งหมดจะถูกลบบนเครื่อง"

9
คุณควรอ่านUnix การกู้คืนตำนาน ตราบใดที่คุณยังเข้าสู่ระบบเชลล์ระบบยังไม่ตายอย่างสมบูรณ์!
200_success

2
@gerrit ฉันไม่ :)
muru

คำตอบ:


79

ไม่สำคัญว่า/bin/rmจะถูกลบ มันถูกเรียกใช้เพียงครั้งเดียวและในตอนนั้นทุกอย่างถูกโหลดในหน่วยความจำเนื่องจากเป็นทุกสิ่งที่จำเป็นในการส่งการลบไปยังระบบไฟล์และดิสก์


แถบด้านข้าง / อัปเดต:ตามคำตอบของ David Hoelzer (และพูดถึงในความคิดเห็น), inode the hardlink ที่/bin/rmใช้ในการชี้จะยังคงอยู่จนกว่าจะrmเสร็จ (เนื่องจาก Linux อยู่ในสถานะเปิด) แต่ความจริงนั้นไม่เกี่ยวข้อง; สถานะของดิสก์ไม่สำคัญเลย

ไบนารีถูกโหลดเข้าสู่หน่วยความจำก่อนที่จะถูกเรียกใช้ แม้ว่าคุณจะสามารถทำลายrmข้อมูลดิสก์ด้วยตนเองแต่จะไม่ส่งผลกระทบหรือหยุดการลบไม่ให้เสร็จสิ้น (สมมติว่าคุณไม่ได้ทำให้ดิสก์ใช้งานไม่ได้)

ไม่ทราบว่า inode หรือ hardlink คืออะไร นี่คือคำตอบที่ฉันทำมันออกมา


อย่างไรก็ตามนี่คือเหตุผลที่คุณสามารถลบแพ็คเกจสำหรับเคอร์เนลปัจจุบันโดยไม่ต้องใช้คอมพิวเตอร์ ตราบใดที่คุณติดตั้งเวอร์ชันอื่นมันจะสามารถบู๊ตได้

อีกครั้งการทำงานนี้เพราะrmถูกเรียกเพียงครั้งเดียว ต่อไปนี้จะล้มเหลวหลังจาก/bin/rmเสียชีวิตเพราะเรียกว่าครั้งเดียวสำหรับทุกชื่อไฟล์:

find / -exec rm {} \;

ที่กล่าวมาfind / -exec rm -rf {} +และfind / -print0 | xargs -0 rm -rfอาจเป็นไปได้ว่าจะล้มเหลวเพราะทั้งคู่มีข้อ จำกัด การโต้แย้งหมายความว่าพวกเขาจะลบไฟล์จำนวนหนึ่งก่อนที่จะถูกเรียกอีกครั้ง ในบางช่วงของการเดินทาง/bin/rmอาจหมดอายุ ( และจะถูกปล่อยออก) ก่อนที่ไฟล์ที่เหลือจะถูกลบ มันไม่ได้รับประกันว่า หาก/bin/มีการป้อนไดเรกทอรีสุดท้ายวิธีการเหล่านี้อาจใช้ได้


7
ตามที่ @DavidHoelzer อธิบายไฟล์ที่ไม่ได้เชื่อมโยงไม่จำเป็นต้องอยู่ในหน่วยความจำเพื่อให้ทำงานได้ เคอร์เนลรู้ว่ามีหมายเลขอ้างอิงไฟล์ที่เปิดอยู่ดังนั้นจึงเก็บข้อมูลไฟล์ไว้รอบ ๆ เพื่อตอบสนองคำขอใด ๆ (รวมถึงหน้าเว็บ) จนกว่าจะปิดหมายเลขอ้างอิงล่าสุด
Andrew Medico

4
@Desty ไม่ว่าจะไม่ประสบความสำเร็จตราบใดที่/bin/rmยังไม่ใกล้พอที่จะเป็นจุดจบที่อยู่ในกลุ่มสุดท้าย -exec ... {} +(การหลีกเลี่ยงแบ็กสแลชไม่จำเป็น) ยังคงส่งผลให้มีการประมวลผลหลายครั้ง ไม่ใช่หนึ่งไฟล์ต่อหนึ่งไฟล์ แต่ต่อหนึ่งแบทช์ขึ้นอยู่กับจำนวนอาร์กิวเมนต์ที่สามารถใส่ลงใน ARG_MAX
ชาร์ลส์ดัฟฟี่

6
@Oli มันไม่ได้เกี่ยวกับการเพจ ตัวนับการอ้างอิงถูกลิงก์กับ inode ไม่ใช่รายการไดเร็กทอรีและตัวจัดการไฟล์ที่เปิดจะนับเป็นข้อมูลอ้างอิง (เช่นเดียวกับฮาร์ดลิงก์) เพื่อป้องกันไม่ให้ inode ถูกจัดสรรคืน ขนาดไฟล์ไม่ได้เป็นปัจจัย แต่อย่างใดและสิ่งนี้จะเกิดขึ้นแม้ว่าจะไม่มีพื้นที่สว็อป (ดังนั้นจึงไม่มีการเพจ) เลย
ชาร์ลส์ดัฟฟี่

2
@CharlesDuffy ไม่ว่าคุณจะมีพื้นที่สว็อปหรือไม่ก็ตามเพจจะถูกใช้สำหรับไฟล์ที่แม็พหน่วยความจำทั้งหมด นั่นรวมถึง executables และไลบรารีทั้งหมด ในความเป็นจริงการขาดพื้นที่สว็อปอาจหมายถึงการเพจเพิ่มเติมสำหรับไฟล์ที่แม็พหน่วยความจำ
kasperd

2
@CharlesDuffy ใช่ขนาดไม่เกี่ยวข้องแน่นอน การแม็พหน่วยความจำไฟล์ไม่ทำให้เนื้อหาใด ๆ ของไฟล์ถูกโหลดจนกว่าจะเข้าถึง และหน่วยความจำที่ใช้ในการโหลดส่วนที่เข้าถึงได้ของไฟล์สามารถถูกปลดปล่อยอีกครั้งหากจำเป็นหลังจากนั้นมันจะถูกโหลดจากไฟล์หากเข้าถึงได้อีกครั้ง ดังนั้นไฟล์จะต้องอยู่ในระบบไฟล์ตราบใดที่มันถูกแม็พและจะทำงานในลักษณะเดียวกันสำหรับไฟล์หนึ่งหน้าเช่นเดียวกับที่ทำสำหรับไฟล์ที่มีขนาดใหญ่พอที่จะขยายพื้นที่ที่อยู่ทั้งหมด (รายละเอียดมีความซับซ้อนมากขึ้นเล็กน้อยสำหรับการจับคู่การคัดลอก -on-write ซึ่งจำเป็นสำหรับการเชื่อมโยงแบบไดนามิก)
kasperd

57

ฉันไม่ได้ลองคำสั่งนี้บน Ubuntu (ด้วยเหตุผลที่ชัดเจน) ดังนั้นฉันจึงไม่แน่ใจว่า Ubuntu จะอนุญาตให้ใช้งานหรือไม่

ฉันทำ. rm -rf / --no-preserve-rootกำลังทำงานในเซสชันรูทที่เปิดโดยตรงบนเครื่องในขณะที่ฉันเชื่อมต่อผ่านsshจากเครื่องอื่นโดยใช้บัญชีรูทด้วย

สิ่งที่เกิดขึ้นคือการที่คุณเริ่มต้นที่จะได้รับเป็นจำนวนมากของข้อความเช่น:

rm: ไม่สามารถลบ '/ ... ': ไม่อนุญาตให้ใช้งาน

หรือ:

rm: ไม่สามารถลบ '/ ... ': อุปกรณ์หรือทรัพยากรไม่ว่าง

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

น่าประหลาดใจที่sshการเชื่อมต่อยังคงเปิดอยู่จนกระทั่งสิ้นสุดการดำเนินการ เฉพาะเมื่อฉันปิดการเชื่อมต่อและพยายามเปิดใหม่อีกครั้งว่ามีข้อผิดพลาดปรากฏขึ้น:

อ่านจากซ็อกเก็ตล้มเหลว: รีเซ็ตการเชื่อมต่อโดยเพียร์

บนเครื่องสี่ไดเรกทอรีที่เหลืออยู่:

  • /dev. นี่คือที่เก็บไฟล์ของอุปกรณ์
  • /procระบบแฟ้มในหน่วยความจำที่สร้างโดยเคอร์เนล
  • /runตำแหน่งระบบไฟล์ที่ได้มาตรฐานสำหรับ daemons
  • /sys. สิ่งนี้อนุญาตให้คุณรับข้อมูลเกี่ยวกับระบบและส่วนประกอบของมัน

ซึ่งหมายความว่ามีไม่เหลือมากและไม่มากที่จะทำ คุณไม่สามารถls(แม้ว่าจะใช้เมื่อTabชื่อของไดเรกทอรีและไฟล์จะยังคงแสดง) คุณสามารถcdในไดเรกทอรีที่แตกต่างกันและechoสิ่งต่าง ๆ แต่คำสั่งเช่นcatไม่สามารถใช้ได้อีกต่อไป

ไม่มีsudoอย่างใดอย่างหนึ่ง

shutdown -h nowและrebootหายไปเช่นกันดังนั้นตัวเลือกเดียวของคุณดูเหมือนจะทำให้เครื่องทำงานล้มเหลว ออกจากระบบ ( exit) ไม่ทำงานแม้ว่าจะแสดงข้อความ "ล็อกเอาต์" ที่ดี

เมื่อคุณพยายามรีบู๊ตเครื่องคุณจะพบกับข้อผิดพลาด GRUB ที่ดี 15 จากนั้นไม่มีอะไรเกิดขึ้น ณ จุดนี้คุณอาจเริ่มคิดว่าคุณrmอาจทำสิ่งที่ไม่ดีกับระบบของคุณ

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

คุณก็ทำได้เช่นกัน

ไม่รออย่าทำบนเครื่องของคุณ!

คุณสามารถทำอะไรแทนคือการใช้เครื่องเสมือน VMs มีประโยชน์ในการทำให้การทดลองเป็นเรื่องง่าย เนื่องจากคุณกำลังใช้อูบุนตู, คุณอาจจะสนใจโดยvmbuilder นี่เป็นเครื่องมือที่ช่วยให้คุณสามารถปรับใช้เครื่องเสมือนได้ในเวลาไม่กี่นาที (เอกสารอย่างเป็นทางการอ้างว่าสามารถทำได้ "ในเวลาประมาณหนึ่งนาที" แต่เวลาจริงแม้ในฮาร์ดแวร์ที่เร็วกว่าจะใช้เวลาประมาณสองถึงสามนาที .

เมื่อการปรับใช้สิ้นสุดลงคุณจะมีสภาพแวดล้อมที่คุณสามารถเล่นได้ หากคุณทำลายมันได้ไม่สำคัญ: คุณปรับใช้เครื่องอีกครั้งและอีกสองนาทีต่อมาคุณสามารถดำเนินการต่อได้

หากคุณใช้ซอฟต์แวร์เช่น VMWare คุณอาจสนใจสแนปชอต (โปรดทราบว่า VMWare Player ฟรีไม่มีคุณสมบัตินี้คุณต้องซื้อ VMware Workstation) โปรดทราบว่า Hyper-V นั้นให้บริการฟรีและสนับสนุนสแน็ปช็อต (แต่คุณต้องเรียกใช้ Windows)

ประโยชน์ของสแนปชอตคือคุณสามารถรับได้ในเวลาไม่กี่มิลลิวินาที การย้อนกลับไปที่สแนปชอตจะใช้เวลานานกว่า แต่มักจะใช้เวลาไม่กี่วินาที ทำให้การทดลองง่ายขึ้นและเร็วขึ้น

การทดลองนี้ไม่ได้ จำกัด อยู่ที่ระบบปฏิบัติการเท่านั้น คุณสามารถทำสิ่งต่าง ๆ ที่เกี่ยวข้องกับซอฟต์แวร์ มีแอปพลิเคชันที่น่าสงสัยใช่ไหม ทดสอบใน VM- ถ้าเป็นไวรัสมันจะไม่ทำอันตรายใด ๆ ต้องการทดสอบการทำงานกับฐานข้อมูลเนื่องจากอาจส่งผลกระทบต่อสภาพแวดล้อมหรือไม่ ทดสอบใน VM

ถ้าคุณทำเช่นนั้นกับเครื่องที่ไม่ได้ทดสอบจริง

สิ่งเลวร้ายเกิดขึ้น โปรดทราบว่าrmปกป้องคุณจากตัวเองrm -rf /จะไม่ทำงาน: --no-preserve-rootคุณจำเป็นต้องใช้ ยังไงถ้าคุณประสบความสำเร็จโดยไม่ตั้งใจเพื่อลบทุกอย่าง

rmยกเลิกการลิงก์ไฟล์เท่านั้น แต่ยังมีข้อมูลอยู่ในฮาร์ดดิสก์ของคุณ สิ่งนี้ทำให้สามารถกู้คืนได้ในภายหลัง (ซึ่งเป็นสาเหตุที่คุณไม่ควรทิ้งฮาร์ดไดรฟ์ของคุณด้วยข้อมูลที่ละเอียดอ่อนเมื่อมันไม่ทำงานอีกต่อไป)

ซึ่งหมายความว่าคุณต้องมีพีซีสำรองที่มีกล่องหุ้มฮาร์ดไดรฟ์เพื่อกู้คืนไฟล์เกือบทั้งหมด สิ่งสำคัญคือการหลีกเลี่ยงการเขียนข้อมูลใด ๆ ลงในฮาร์ดดิสก์เพื่อกู้คืนข้อมูลที่คุณเขียนจะเขียนทับไฟล์ที่ไม่ได้เชื่อมโยง

ตามที่ระบุไว้โดยบทความในความคิดเห็นของ 200_successถ้าคุณทำตัวฉลาดคุณสามารถเอาเครื่องกลับมาได้แม้ไม่มีพีซีสำรอง หากคุณใส่ใจกับข้อมูลฉันจะไม่รบกวนการกู้คืนข้อมูลด้วยพีซีสำรองนั้นง่ายกว่ามาก


VirtualBox รองรับสแนปชอตของดิสก์
นาธานออสมัน

1
โปรดทราบว่าไวรัสมักได้รับการออกแบบมาเพื่อตรวจจับ VM ดังนั้นฉันจะไม่แนะนำกระบวนการตรวจจับไวรัสนี้ คำถามเล็ก ๆ : สี่ไดเรกทอรีที่เหลือนั้นไม่ใช่ไดเรกทอรี "ของจริง" ใช่ไหม? พวกเขาไม่ได้อยู่บนฮาร์ดไดรฟ์จริงเหรอ? ยังคงมีอะไรในฮาร์ดไดรฟ์หลังจากเรียกใช้คำสั่งนี้
raptortech97

2
@ raptortech97 rmไม่ได้ลบข้อมูลออกจากฮาร์ดไดรฟ์จริงๆเพียงแค่ "ยกเลิกการเชื่อมโยง" (ยกเลิกการเชื่อมโยง) ข้อมูลจริงบนดิสก์จากแผนผังระบบแฟ้มทำเครื่องหมายว่าว่าง (เพื่อให้สามารถเขียนทับได้ในที่สุดผ่านการใช้คอมพิวเตอร์ปกติ) ดังนั้นถ้าคุณบอกว่าrm -rf ~ไม่ใช่ทุกอย่างจะหายไปตราบใดที่คุณทำอย่างรวดเร็ว (เช่นกับextundelete) คุณคิดว่าเป็นโฟลเดอร์ "ลบ" เวอร์ชันที่ไม่น่าเชื่อถือมากกว่าเดิมในกล่องจดหมายของคุณคุณสามารถเรียกคืนได้หากไม่รอนาน แต่ในที่สุดมันจะถูกลบทิ้ง
โทมัส

@ raptortech97 ในทางกลับกันถ้าด้วยเหตุผลบางอย่างที่คุณไม่ได้ใช้rmแต่shredมันเป็นเกมที่ค่อนข้างดีแม้ว่าคุณอาจมีเวลาที่จะตระหนักถึงความผิดพลาดและการยกเลิกเนื่องจากการหั่นย่อยใช้เวลานานกว่า
โทมัส

5
ไดเรกทอรีที่ถูกเก็บไว้เป็นจุดเชื่อมต่อส่วนใหญ่ของบางรูปแบบหรืออื่น ๆ และคำสั่งที่ทำงานต่อไปคือคำสั่ง bash builtin ไม่ใช่ไบนารีแยก ดังนั้นในขณะที่lsหายไปfor i in /*; do echo $i; doneควรทำงาน และที่จะเปลี่ยนคุณอาจใช้คำสั่งเช่นcat while read i; do echo $i; done < /proc/self/maps
MvG

25

เหตุผลก็คือเลเยอร์การตั้งชื่อไฟล์ (สิ่งที่คุณเห็นls) เป็นเพียงเพื่อความสะดวกของคุณ ไดรเวอร์ระบบไฟล์และเคอร์เนลจะดูแลเฉพาะไอโหนดเท่านั้น เมื่อไฟล์ถูกอ้างอิงโดยชื่อไฟล์จะถูกแปลเป็น inode ทันทีซึ่งมีข้อมูลเมตาทั้งหมดรวมถึงการอนุญาตบล็อกข้อมูลบนดิสก์ ID เจ้าของเจ้าของกลุ่ม ID และจำนวนลิงค์

ลิงค์นับเป็นสิ่งที่สำคัญจริงๆที่นี่ เมื่อคุณลบไฟล์บนระบบ UNIX unlinkที่เรียกระบบที่เกิดขึ้นจริงเป็น สิ่งที่เกิดขึ้นภายใต้ประทุนคือจำนวนลิงค์ (จำนวนชื่อไฟล์ในเลเยอร์การตั้งชื่อไฟล์) ที่ชี้ไปที่ไอโหนดนั้นลดลง ระบบไฟล์รู้ว่าไฟล์ถูกลบเมื่อจำนวนลิงก์ถึงศูนย์

เมื่อไฟล์ถูกลบโดยrmมันจะแก้ไขไฟล์ไดเรกทอรี (ใช่มันเป็นเพียงไฟล์ที่มีชื่อไฟล์และ inode นอกเหนือจากบิตอื่น ๆ ที่ไม่สำคัญสำหรับคำตอบนี้) อย่างไรก็ตามการยกเลิกการเชื่อมโยงนั้นจะทำให้ทรัพยากรดิสก์เป็นอิสระ

สิ่งนี้นำไปสู่ผลกระทบที่น่าสนใจอื่น ๆ ขั้นแรกเป็นไปได้ที่จะเปิดไฟล์ที่มีจำนวนลิงค์เป็นศูนย์ นี้เกิดขึ้นเมื่อลบรายการสำหรับrm -rf / /bin/rmไฟล์เปิดอยู่ (มีตัวจัดการไฟล์อยู่) แต่ inode ถูกทำเครื่องหมายว่าถูกลบ (จำนวนลิงค์ = 0) ทรัพยากรดิสก์จะไม่ถูกปล่อยและนำกลับมาใช้ใหม่จนกว่าหมายเลขอ้างอิงไฟล์จะปิด

สิ่งที่น่าสนใจอีกอย่างคือสิ่งที่เกิดขึ้นเมื่อคุณมี inode ที่มีลิงค์นับมากกว่าศูนย์ แต่ไม่มีอะไรในเลเยอร์การตั้งชื่อไฟล์ที่ชี้ไปที่มัน นี่คือไฟล์ที่ถูกซ่อนไว้อย่างดี :) ในการเข้าถึงมันคุณจะต้องใช้บางสิ่งบางอย่างในระดับต่ำในการอ้างอิงโดยใช้หมายเลขไอโหนดแทนชื่อ (เพราะไม่มี) หรือแก้ไขรายการไดเรกทอรีเพื่อชี้ไปที่ไอโหนดโดยใช้โปรแกรมแก้ไขฐานสิบหก

สิ่งที่น่าสนใจอันดับที่สามคือสิ่งที่เกิดขึ้นถ้าคุณลดจำนวนการเชื่อมโยงเป็นศูนย์ แต่ให้ชี้รายการไดเรกทอรีที่ inode ฉันจะปล่อยให้คุณทดสอบด้วยหากคุณต้องการ ถึงแม้ว่าทั้งสองอย่างนี้จะนำไปสู่ระบบไฟล์ที่อยู่ในสถานะที่ไม่สอดคล้องกัน


หากมองอีกวิธีการนับลิงก์จะไม่เป็นศูนย์เพราะการเปิดไฟล์จะเพิ่มลิงค์ภายใน / proc
OrangeDog

@OrangeDog พฤติกรรมนี้ยังคงมีอยู่แม้ว่าจะยกเลิกการติดตั้ง procfs
Charles Duffy

1
@OrangeDog Charles Duffy ถูกต้อง ไฟล์จัดการใน / proc ไม่แก้ไข inodes ปรับการนับลิงค์
David Hoelzer

/ proc และ / sys เป็นภาพสะท้อนของสถานะระบบปัจจุบัน (เคอร์เนล) เลือกการกระทำกับไฟล์และไดเรกทอรีที่มีการเปลี่ยนแปลงสถานะของระบบเท่านั้น
CVn

18

คำตอบก่อนหน้านี้ดี แต่ฉันต้องการอธิบายรายละเอียดหนึ่งอย่าง:

rmไม่ใช่แค่คำสั่ง PATHมันเป็นโปรแกรมที่พบใน

ดังนั้นจะเกิดอะไรขึ้นเมื่อคุณดำเนินการต่อไปนี้:

  • คุณโทร (เป็น root) rm -rf /
  • อินสแตนซ์ของโปรแกรมrmถูกโหลดในหน่วยความจำพร้อมอาร์กิวเมนต์-rfและ/
  • ตามโปรแกรมข้อโต้แย้งเหล่านี้rmเริ่มต้นการดำเนินงานของมัน (จะผ่านทุกอย่างในเมาท์ / พาร์ทิชันและลบการอ้างอิงซ้ำ ๆ [ขอโทษสำหรับความเป็นเชิงเทคนิค;)])
  • เมื่อเสร็จสิ้นแล้วอินสแตนซ์ของrmโปรแกรมจะถูกยกเลิกการโหลด
  • ณ จุดนี้สิ่งเดียวในหน่วยความจำคือโปรแกรมที่โหลดไว้ก่อนหน้านี้ (เช่นทุบตีถ้าคุณเปิดเทอร์มินัลใน Ubuntu, สภาพแวดล้อมเดสก์ท็อป, เคอร์เนล, ไดรเวอร์ ฯลฯ )
  • หากคุณพยายามเรียกคำสั่งอื่นใด (ซึ่งในกรณีของ Linux ทำให้เป็นโปรแกรมแบบสแตนด์อโลน) มันจะล้มเหลวเนื่องจากไม่พบโปรแกรมดังกล่าวในตำแหน่ง PATH (และตำแหน่ง PATH ไม่มีอีกต่อไป) อย่างไรก็ตามทุกอย่างที่โหลดครั้งเดียวจะยังคงทำงานอยู่

เพียงเพื่อความเข้าใจว่ามันทำงานอย่างไรลองติดตั้ง LAMP บน ubuntu (ใน Virtualbox) สคริปต์บางตัวและแคช opcode PHP จากนั้นเรียกใช้คำสั่งชั่วร้ายนี้ น่าแปลกใจ (ถ้าคุณโชคดีพอและแคช opcode ของคุณจะไม่สังเกตเห็นการลบไฟล์ php) คุณยังสามารถเข้าถึงสคริปต์ PHP จากภายนอกผ่านทางเว็บเซิร์ฟเวอร์ apache!

PS: คำสั่งชั่วร้ายนี้ทำงานแม้ในขณะที่รูทเคยชินลบeverythingมันไม่สามารถลบกระบวนการสิทธิพิเศษเคอร์เนลจาก/procและไม่สามารถลบบางสิ่งจาก/devอุปกรณ์ที่ปรากฏบนระบบของคุณเป็นไฟล์ ในความเป็นจริงรากไม่ได้เป็นอย่างที่เราคิดเคอร์เนลในทางกลับกันคือ

PPS: นอกจากนี้ยังเป็นความคิดที่สองที่คุณจะยังคงมีไฟล์ที่ถูกดำเนินการlockedโดยกระบวนการอื่นในเวลาที่พยายามลบ


บน Linux คุณสามารถลบโหนดอุปกรณ์ออกได้อย่างแน่นอนเมื่อทำงานเป็นรูท แต่ใช่คุณไม่สามารถลบอะไรได้/procเนื่องจากเป็นระบบไฟล์แบบอ่านอย่างเดียว /sysในทำนองเดียวกันสำหรับ ฉันเชื่อว่าคุณไม่สามารถลบจุดเชื่อมต่อได้
Brian

@AlexKey ฉันขอแนะนำให้แก้ไขเพื่ออธิบายความหมายของคำสั่ง "non-kernel embedded" (หรือเพื่อหลีกเลี่ยงวลีนั้น) ดูเหมือนว่าคุณกำลังบอกว่ามีคำสั่งที่คุณสามารถเรียกใช้ผ่านเชลล์ที่นำไปใช้โดยตรงในเคอร์เนลดังนั้นพวกเขาจึงทำงานได้เสมอไม่ว่าอะไรก็ตาม (ซึ่งก็คือตามที่คุณรู้ แต่ผู้อ่านจำนวนมากอาจไม่ได้เป็นเช่นนั้น: เมื่อคุณเรียกใช้คำสั่งเช่นcdนี้จะเรียกเชลล์ builtinโดยใช้ชื่อนั้น - คำสั่งนั้นถูกสร้างไว้ในเชลล์ไม่ใช่เคอร์เนล) หมายถึง Alt + SysRq "command"?
Eliah Kagan

@Brian มันขึ้นอยู่กับ distro? ฉันทำงานในหลากหลาย distros และตลกที่มันทำผิดพลาดหลายครั้ง ขณะที่ผมจำได้ว่าหลังจากการตรวจสอบซากของ / ยังคงเป็นสิ่งที่อยู่ใน / dev แต่มันอาจจะเป็นสิ่งเช่นซีดีรอมหรือฟลอปปี้ ...
Alexey Kamenskiy

@EliahKagan ในขณะที่ฉันพยายามจะแยกความเป็นอิสระฉันจึงใช้คำนี้ มันหมายความว่าไม่ได้อยู่ในทุกคำสั่งระบบ cli หมายถึงโปรแกรมภายนอก แต่ขอบคุณที่ชี้ให้เห็นว่าฉันจะชี้แจงจุด
Alexey Kamenskiy

@ Alexey ฉันเชื่อว่าคุณจะไม่สามารถลบออกได้/dev/ptsเนื่องจากเป็นจุดเมานต์ (และระบบไฟล์แบบอ่านอย่างเดียว)
Brian

1

เมื่อทุกอย่างถูกลบออกจากฮาร์ดไดรฟ์เคอร์เนลก็ยังทำงานได้ แต่ติดอยู่เนื่องจากไม่มีอุปกรณ์และโปรแกรมคำสั่ง ฯลฯ เหลืออยู่

ระบบปฏิบัติการจะไม่ทำงานอีกต่อไป

และมันเป็นความจริงที่ Oli พูดว่าคำสั่งจะถูกโหลด / ดำเนินการในหน่วยความจำและไม่มีอะไรจะหยุดจนกว่าคุณจะฆ่ากระบวนการนี้ (แน่นอนถ้าคำสั่ง kill ยังคงปรากฏอยู่ ^^)


4
ทำไมเคอร์เนลถึงติด? คำตอบโดย MainMa แนะนำเป็นอย่างอื่นและสนับสนุนสิ่งที่ฉันคาดหวัง
MvG

4
โปรแกรมทำงานจากหน่วยความจำไม่ใช่ฮาร์ดไดรฟ์ เคอร์เนลจะไม่ทราบว่ามีอะไรผิดปกติจนกระทั่งรีบูต
phyrfox

บางทีฉันอาจจำเป็นต้องเปลี่ยนคำที่ฉันใช้เคอร์เนลจะ "ติด" ไม่มากก็น้อยโดยไม่ต้องใช้อุปกรณ์โปรแกรม ฯลฯ และถ้าคุณไม่ได้อยู่หน้าคอนโซลรูทคุณไม่สามารถทำสิ่งที่ไม่ดีได้ คอนโซลคุณไม่สามารถทำสิ่งที่ไม่ดี แต่ฉันจะเปลี่ยนถ้อยคำของฉันในคำตอบของฉันในขณะที่มันทำให้เข้าใจผิดฉันเห็นด้วย
s1mmel

0

โปรดทราบว่าหากระบบมี selinux และ selinux อยู่ในโหมดบังคับใช้และนโยบายของ selinux ได้รับการตั้งค่าอย่างเหมาะสม แล้วจะไม่มีอะไรเกิดขึ้นมากมาย

Selinux เป็นระบบควบคุมการเข้าถึงที่จำเป็นซึ่งหมายความว่าผู้ใช้รูทมีอำนาจทำลายระบบไม่ได้มากกว่าผู้ใช้รายอื่นในระบบ

Selinux ถูกบังคับใช้ในเคอร์เนล คุณจะต้องประนีประนอมเคอร์เนลเพื่อที่จะได้อยู่กับมัน

ในระบบที่ออกแบบมาอย่างดีพร้อมกับนโยบาย Selinux ที่ดีรูตจะไม่สามารถทำอะไรได้มากมายบนระบบ

การแก้ไขในภายหลังของ Android มีการบังคับใช้ Selinux ด้วยเหตุผลนี้

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