การทดสอบช่องโหว่ Shellshock ที่ปรับปรุงแล้วสำหรับ CVE-2014-7169 นั้นทำงานอย่างไร


11

ฉันเข้าใจการทดสอบดั้งเดิมสำหรับ CVE-2014-6271 ซึ่งก็คือ:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

แต่ฉันสับสนโดยการทดสอบที่ปรับปรุงและผลลัพธ์ที่สอดคล้องกันสำหรับ CVE-2014-7169:

$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST

มีคนอธิบายสั้น ๆ ว่าเกิดอะไรขึ้นที่นี่และจะข้ามแพทช์สำหรับ CVE-2014-6271 ได้อย่างไร


คำตอบ:


13

ฉันขุดรอบ ๆ เว็บมาซักนิดแล้วตั้งแต่ฉันโพสต์คำถามนี้ครั้งแรก

ตามการค้นพบข้อผิดพลาดดั้งเดิมทุบตีก่อนแพทช์ CVE-2014-6271 นำเข้าฟังก์ชั่นเช่น:

foo=() {
  code
}

โดยแทนที่เครื่องหมายเท่ากับด้วยช่องว่างและตีความมัน ... ซึ่งหมายถึงการตีความเกินความหมายของฟังก์ชั่นที่เป็นไปได้

แพทช์สำหรับ CVE-2014-6271 แนะนำโหมดพิเศษของ parse_and_execute () ฟังก์ชั่นในการประเมินผลการ จำกัด นิยามฟังก์ชันและไม่เกินกว่านั้น

อย่างไรก็ตามดังที่อธิบายไว้ในหัวข้อนี้ตัวแปรสภาพแวดล้อมที่สร้างขึ้นเป็นพิเศษของการทดสอบช่องโหว่ CVE-2014-7169 ได้รับการออกแบบมาเพื่อ 1) ทำให้ parser สับสนจนตาย 2) ทิ้งเศษวัสดุไว้ในบัฟเฟอร์ 3) เปลี่ยนสิ่งที่คำสั่ง bash เดิมทำเมื่อ มันรวมกับเรื่องที่สนใจที่มีอยู่แล้วในบัฟเฟอร์

ดังนั้นเพื่อแยกตัวแปรสภาพแวดล้อม:

X='() { (a)=>\'

  • () { (a)=>\ตัวแยกวิเคราะห์จะวิเคราะห์ โปรดทราบว่า\เป็นส่วนหนึ่งของสตริง; มันไม่ได้หนีออกจากคำพูดเดียวต่อท้าย

() {

  • parser ระบุว่านี่เป็นนิยามฟังก์ชัน

(a)=

  • สิ่งนี้ทำให้ผู้แยกวิเคราะห์สับสน

>\

  • โปรแกรมแยกวิเคราะห์ออกจากอักขระสองตัวสุดท้ายที่อยู่ในบัฟเฟอร์

>\[NEWLINE]

  • ณ จุดหนึ่งก่อนที่shคำสั่งจะทำงานบรรทัดใหม่จะถูกวางในบัฟเฟอร์

>\[NEWLINE]echo date

  • เมื่อshมีการเรียก (ซึ่งอาจเป็น symlink เพื่อทุบตีในกรณีนี้) มันจะเพิ่มอาร์กิวเมนต์คำสั่งของมันecho dateไปยังตัวละครที่มีอยู่แล้วในบัฟเฟอร์

>echo date

  • ตั้งแต่การขึ้นบรรทัดใหม่จะหนีทุบตีจะแยกบัฟเฟอร์เป็นซึ่งมีผลเช่นเดียวกับ>echo date date > echoไฟล์ที่ชื่อechoถูกสร้างขึ้นและ stdout ของdateคำสั่งจะถูกเปลี่ยนเส้นทางไปยังมัน

; cat echo

  • คำสั่งที่สองเพียงแสดงเนื้อหาของไฟล์ที่สร้างขึ้นใหม่


2

มันไม่ได้ให้ผลลัพธ์ที่ดีกับคุณ แต่มันแสดงให้เห็นถึงข้อผิดพลาด

โดยไม่มีข้อผิดพลาดตัวแปรสภาวะแวดล้อมXควรถูกละเว้น, bash ควรรันecho dateและ cat ควรบ่นว่าไม่มีไฟล์ชื่อ echo เช่นพิจารณาวิธีการทำงานของเส้นประ:

me@myserver$ rm -f echo && env -i  X='() { (a)=>\' dash -c 'echo date'; cat echo
date
cat: echo: No such file or directory

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

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