ในคำว่า "ไม่"
Linux ไม่ได้แยกความแตกต่างระหว่างโปรแกรมเรียกใช้งานและสคริปต์ #!
ที่จุดเริ่มต้นคือวิธีที่จะบอกเคอร์เนลว่าโปรแกรมที่จะเรียกใช้ในการประเมินการป้อนข้อมูล แต่มันไม่ได้เป็นวิธีเดียวที่สคริปต์สามารถดำเนินการได้
ตัวอย่างเช่นถ้าฉันมีสคริปต์
$ cat x
#!/bin/sh
echo hello
จากนั้นฉันก็สามารถรันสิ่งนี้ได้ด้วยคำสั่ง
$ ./x
ที่จะทำให้เคอร์เนลลองและดำเนินการให้ตรวจหาจุด#!
แล้วรันอย่างมีประสิทธิภาพ/bin/sh x
แทน
อย่างไรก็ตามฉันยังสามารถเรียกใช้ตัวแปรเหล่านี้เช่นกัน:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
หรือแม้กระทั่ง
. ./x
ดังนั้นแม้ว่าเคอร์เนลพยายามบังคับใช้การลงชื่อที่ exec
เลเยอร์เราสามารถเลี่ยงสิ่งนี้ได้โดยการเรียกใช้ล่ามโดยใช้สคริปต์เป็นพารามิเตอร์เท่านั้น
ซึ่งหมายความว่ารหัสการลงนามจะต้องอยู่ในล่ามเอง และสิ่งใดที่จะหยุดผู้ใช้ไม่ให้รวบรวมเชลล์ของตนเองโดยไม่มีรหัสการลงนาม?
วิธีการแก้ปัญหามาตรฐานในการนี้จะไม่ใช้การลงนาม แต่จะใช้การควบคุมบังคับ Access (MAC) SELinux
เช่น ด้วยระบบ MAC คุณสามารถระบุสิ่งที่ผู้ใช้แต่ละคนได้รับอนุญาตให้เรียกใช้และเลเยอร์การเปลี่ยนแปลง ตัวอย่างเช่นคุณสามารถพูดว่า "ผู้ใช้ปกติสามารถเรียกใช้อะไรก็ได้ แต่กระบวนการเว็บเซิร์ฟเวอร์และกระบวนการ CGI สามารถเข้าถึงสิ่งต่าง ๆ จาก/var/httpd
ไดเรกทอรีเท่านั้นทุกอย่างถูกปฏิเสธ"