ฉันขุดรอบ ๆ เว็บมาซักนิดแล้วตั้งแต่ฉันโพสต์คำถามนี้ครั้งแรก
ตามการค้นพบข้อผิดพลาดดั้งเดิมทุบตีก่อนแพทช์ 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
- คำสั่งที่สองเพียงแสดงเนื้อหาของไฟล์ที่สร้างขึ้นใหม่