Score:0

ฉันจะรับเส้นทางที่ถูกต้องจากการโต้แย้งในสคริปต์ #!/bin/sh ได้อย่างไร

ธง cn

ฉันมีสคริปต์ (สำเนา) และต้องการรับเส้นทางที่ถูกต้อง

#!/bin/sh
cp -R $1 $2

ฉันลองด้วยพารามิเตอร์เช่นนี้

./copy.sh /home/apple /home/pie;รีบูต

จากนั้นเซิร์ฟเวอร์ถูกรีบูตและเซิร์ฟเวอร์ที่ใช้งานจริงไม่สามารถยอมรับได้

ฉันรู้ว่าเส้นทาง linux ประกอบด้วย [a-zA-Z0-9_-/. ]

ฉันจะกรอง $1 และ $2 ได้อย่างไร เพื่อให้ฉันโทรหาได้อย่างไร้กังวล

#!/bin/sh
$filtered_path_1=some_filter_funtion($1)
$filtered_path_2=some_filter_function($2)
cp -R $filtered_path_1 $filtered_path_2

พื้นหลัง

ฉันมี jenkinsfile และเรียก sh 'sudo /home/copy.sh ${Workspace} ${targetdir}' ใน jenkinsfile นี้ เนื่องจากผู้ใช้เจนกินส์ไม่มีสิทธิ์ในการเขียน ${targetdir} ฉันจึงให้สิทธิ์รูทแก่ผู้ใช้เจนกินส์ในสคริปต์ copy.sh นี้เท่านั้น

ซูโด วิซูโด เจนกินส์    
ทั้งหมด = NOPASSWD: /home/copy.sh 

และไฟล์เจนกินส์นี้อยู่ในที่เก็บ git หากตัวร้ายแก้ไขไฟล์เจนกินส์นี้ด้วยโค้ดที่ไม่ถูกต้อง เช่น รีบูตและคอมมิตไฟล์ การคัดลอกสคริปต์จะถูกเรียกใช้โดยอัตโนมัติ เนื่องจากสคริปต์นี้เรียกว่าสิทธิ์รูท เขาจึงสามารถทำสิ่งเลวร้ายได้โดยใช้จุดอ่อนนี้ เขาจะลบ sh 'sudo /home/copy.sh ${Workspace} ${targetdir}' และ จะเพิ่ม sh 'sudo /home/copy.sh /tmp /var;reboot'

ฉันจะปกป้องเขาได้อย่างไร

cn flag
วางรหัสของคุณใน https://www.shellcheck.net เพื่อรับคำแนะนำในการแก้ปัญหานี้
Denis Turgenev avatar
cn flag
@glenn ขอบคุณ และฉันคิดว่ามันไม่ได้ให้วิธีแก้ปัญหาในการเปลี่ยน $1->$safe1
ru flag
@DenisTurgenev ไม่มีส่วนเกี่ยวข้องกับการแยกวิเคราะห์อาร์กิวเมนต์เพื่อให้ปลอดภัย มันเป็นทุกอย่างที่เกี่ยวข้องกับสภาพแวดล้อมเชลล์ที่คุณกำลังดำเนินการตามค่าเริ่มต้น (เช่น bash) คำตอบของฉันมีรายละเอียดทั้งหมด และให้สคริปต์ทดสอบและชุดคำสั่งที่แสดงให้คุณเห็นโดยไม่ทำให้ระบบของคุณเสียหาย
bac0n avatar
cn flag
`./copy.sh evil.sh copy.sh` อ๊ะ
Score:2
ธง ru

สิ่งนี้ไม่เกี่ยวข้องกับสคริปต์ของคุณ ใน Bash shell, the ; ถูกมองว่าเป็นคำสั่งสิ้นสุดสำหรับสตริงคำสั่ง และหลังจากนั้นจะเป็นคำสั่งรอง ดังนั้นวิธีการประมวลผลสิ่งของของคุณจึงมีผลดังนี้

  1. ดำเนินการคำสั่งก่อนที่ ;:

    ./copycron.sh /home/apple /home/พาย
    
  2. ดำเนินการคำสั่งที่สองหลังจาก ;:

     รีบูต
    

เนื่องจากคุณกำลังดำเนินการน่าจะเป็น ราก หรือ superuser มันรีบูทสำเร็จ

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


คุณสามารถทดสอบสิ่งนี้ด้วยสคริปต์ต่อไปนี้ จากนั้นเรียกใช้คำสั่ง:

ไฟล์: argecho.sh

#!/bin/bash

echo "อาร์กิวเมนต์ที่คั่นด้วยช่องว่าง: $*"
เสียงก้อง ""
เสียงสะท้อน "------"
เสียงก้อง ""

คำสั่งให้ดำเนินการ: ./argecho.sh foo bar baz /tmp/something.txt;echo ฉันทำอย่างอื่นไปแล้ว

เอาต์พุต:

$ ./argecho.sh foo bar baz /tmp/something.txt;echo ฉันทำอย่างอื่นนอกสคริปต์ เห็นไหม
อาร์กิวเมนต์ที่คั่นด้วยช่องว่าง: foo bar baz /tmp/something.txt

------

ฉันทำอย่างอื่นนอกสคริปต์เห็นไหม

คุณจะสังเกตเห็นว่า 'echo' และอาร์กิวเมนต์อื่นๆ ในนั้นไม่รวมอยู่ในอาร์กิวเมนต์ของคุณในสคริปต์ของคุณ นี่คือพฤติกรรมทุบตีมาตรฐาน



จากการแก้ไขของคุณ ข้อกังวลของคุณคือมีใครบางคนกำลังขโมยคำสั่งที่เก็บ Jenkins ของคุณและออกคำสั่งที่เป็นอันตราย โดยการเปลี่ยนสคริปต์จาก sh 'copycron "${พื้นที่ทำงาน}" "${targetdir}"' ถึง sh copycron /home /boot;ปิดเครื่อง

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

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

Denis Turgenev avatar
cn flag
ฉันมี jenkinsfile และเรียก `sh 'copycron ${Workspace} ${targetdir}'` ใน jenkinsfile และไฟล์เจนกินส์นี้อยู่ในที่เก็บ git ผู้ใช้เจนกินส์มีสิทธิ์รูทเฉพาะในสคริปต์ copycron นี้ผ่าน `sudo visudo jenkins ALL = NOPASSWD: /home/copycron` เนื่องจาก jenkins ไม่มีสิทธิ์ในการเขียน ${targetdir} และถ้าคนเลวแก้ไข jenkinsfile นี้ด้วยโค้ดที่ไม่ถูกต้อง เช่น รีบูตและคอมมิต สคริปต์ copycron จะถูกเรียกโดยอัตโนมัติ และเนื่องจากสคริปต์นี้ ถูกเรียกว่ามีสิทธิ์รูท เขาสามารถทำสิ่งเลวร้ายได้
ru flag
นี่เป็นข้อจำกัดของการโทรของคุณผ่าน `sh` ไม่ใช่ข้อจำกัดของอย่างอื่นหรือแม้แต่สคริปต์ของคุณ ปัญหาคือ `sh` รันสิ่งนี้ในเชลล์แบบเดียวกับที่ฉันรันใน Bash คุณควรใส่เครื่องหมายคำพูดเต็มรอบข้อโต้แย้งของคุณ ถ้าคุณต้องการให้มัน 'สะอาด' และไม่เรียกใช้ เช่น.`sh 'copycron "${Workspace}" "${targetdir}"'` ด้วยวิธีนี้ถือว่า ; เป็นส่วนหนึ่งของสตริง จากนั้นสคริปต์ของคุณจะเกิดข้อผิดพลาดเนื่องจากไม่พบ targetdir
Denis Turgenev avatar
cn flag
ปัญหาคือคนเลวสามารถเปลี่ยนสคริปต์แบบละเอียดของฉันได้อย่างง่ายดาย `sh 'copycron "${Workspace}" "${targetdir}"'` -> `sh copycron /home /boot;shutdown` เนื่องจากไฟล์ jenkins อยู่ในที่เก็บ git
ru flag
@DenisTurgenev ฉันคิดว่าฉันต้องถามคำถามอื่น: ทำไมคุณถึงกังวลว่า 'คนเลว' มีส่วนเกี่ยวข้อง? หากพื้นที่เก็บข้อมูลได้รับการรักษาความปลอดภัยอย่างเหมาะสม คนเลวจะไม่สามารถเข้าถึงการแก้ไขสคริปต์ได้ หากคนเลว *เข้าถึง* สคริปต์ได้ คุณจะถูกบังคับให้ทำด้วยวิธีใดวิธีหนึ่ง ไม่มีทางที่จะล้างคำสั่งที่คุณระบุได้ นั่นเป็นความล้มเหลวในการควบคุมที่เก็บข้อมูลของคุณ ไม่ใช่ปัญหาสคริปต์ Bash และ *ไม่ใช่* สิ่งที่คุณจะสามารถป้องกันได้หากคุณไม่รักษาความปลอดภัยที่เก็บคำสั่งของคุณอย่างเหมาะสม
Denis Turgenev avatar
cn flag
แล้วคุณเรียกคนเลวแบบนี้ในแง่ความปลอดภัยว่าอะไร? :) ฉันไม่ใช่ผู้เชี่ยวชาญด้านความปลอดภัยและไม่ใช่ผู้เชี่ยวชาญด้านภาษาอังกฤษด้วย
Denis Turgenev avatar
cn flag
โครงการนี้เป็นโครงการที่พัฒนาโดยนักพัฒนา 50 คน และแน่นอนว่ามีเพียงบุคคลเหล่านี้เท่านั้นที่สามารถเข้าถึงได้ด้วยบัญชีของพวกเขา ตัวอย่างเช่น นักพัฒนาคนหนึ่งถูกไล่ออก และในขณะที่เขาออกจากบริษัท เขาพูดว่า 'ไปลงนรก!' และสามารถดำเนินการนี้ได้ แต่นี่เป็นข้อสันนิษฐานที่รุนแรงเกินไปหรือไม่? :) ฉันชอบจินตนาการมาก ดังนั้นโปรดยกโทษให้ฉันหากฉันรุนแรงเกินไป
ru flag
นี่เป็นการอภิปรายที่ใหญ่กว่าความคิดเห็นที่สามารถดำเนินการได้ และจะเริ่มกำหนดให้ฉันสวมหมวกรักษาความปลอดภัยเพื่อให้คำอธิบายที่เหมาะสมแก่คุณเกี่ยวกับปัญหา "ภัยคุกคามจากวงใน" และการจัดการผู้ใช้ที่ไม่เหมาะสมและการตรวจสอบที่ไม่เหมาะสมในด้านของคุณ หากคุณต้องการสนทนา ฉันสามารถสร้างห้องสนทนาสำหรับคุณและฉันเพื่อหารือเกี่ยวกับเรื่องนี้ในเชิงลึก อย่างไรก็ตาม มันเป็นปัญหาเชิงลึกมากกว่าที่จะพูดคุยในความคิดเห็น
Denis Turgenev avatar
cn flag
ขอบคุณ ฉันจะรวบรวมปัญหาด้านความปลอดภัยเพิ่มเติมและจะติดต่อคุณในไม่ช้า ขอบคุณสำหรับเวลาและความช่วยเหลืออันมีค่าของคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา