- ZIP ซอร์สโค้ดของ ANC Operation Vula ที่ถูกเก็บไว้พร้อมรหัสผ่านตั้งแต่ปี 1991 ถูกถอดรหัส ทำให้สามารถเปิดเผยโค้ดสื่อสารลับที่ใช้ต่อต้านระบอบอพาร์ตไฮด์ของแอฟริกาใต้ได้
- โค้ดนี้ถูกใช้ในช่วงปลายทศวรรษ 1980 เพื่อสร้างเครือข่ายใต้ดินของ ANC ภายในแอฟริกาใต้ และใช้ คอมพิวเตอร์ 8 บิต ร่วมกับโทน DTMF, acoustic coupler และ PowerBASIC เพื่อรับส่งข้อความเข้ารหัสแบบ one-time pad
- ZipCrypto ของ PKZIP ยุคแรกมีช่องโหว่ต่อ known-plaintext attack และใช้ bkcrack เพื่อกู้คืนคีย์จากการค้นหา plaintext 12 ไบต์ที่คาดเดาได้ภายใน ZIP
- การโจมตีใช้รายการแบบไม่บีบอัด Store ใน ALLBAS.ZIP, เฮดเดอร์ PK ของ ZIP ภายใน และชื่อไฟล์แรก COMKEY.BAS และหลังจาก 23 นาทีได้คีย์
98e0f009 48a0b11a c70f8499 - RANDOM.BAS และ TECOD.BAS ที่ถอดรหัสแล้วถูกคอมไพล์และรันใน DOSBox โดยยืนยันวิธีสร้างข้อมูลสุ่ม, เข้ารหัส/ถอดรหัสไฟล์, ใช้ RAM disk และทำลายข้อมูลคีย์หลังใช้งาน
เหตุผลที่โค้ด Operation Vula ถูกล็อกไว้
- Operation Vula เป็นปฏิบัติการในช่วงปลายทศวรรษ 1980 เพื่อพาผู้นำและสิ่งของของ ANC เข้าไปในแอฟริกาใต้ และสร้างเครือข่ายใต้ดินที่เชื่อมโยงองค์ประกอบการเคลื่อนไหวภายในประเทศ
- เพื่อการสื่อสารที่ปลอดภัย มีการใช้คอมพิวเตอร์ 8 บิต, โทน DTMF, acoustic coupler, อุปกรณ์หลายชนิด และโปรแกรม PowerBASIC เพื่อแลกเปลี่ยน ข้อความเข้ารหัสแบบ one-time pad
- Tim Jenkin ผู้สร้างระบบเข้ารหัสเป็นหลัก ได้เปิดเผยโค้ดต้นฉบับไว้ที่ Vulacode GitHub และมีคำอธิบายละเอียดอยู่ใน Talking To Vula.pdf
- เหตุผลโดยตรงที่การเปิดเผยโค้ดล่าช้าคือไฟล์ ZIP ที่ตั้งรหัสผ่านไว้ตั้งแต่ปี 1991
- ตอนที่ Tim Jenkin ออกจากสหราชอาณาจักรเพื่อกลับไปแอฟริกาใต้ เขารวมซอร์สโค้ดทั้งหมดเป็น ZIP และตั้งรหัสผ่าน
- หลังจากนั้นในแอฟริกาใต้ก็ไม่มีความจำเป็นต้องเปิดโค้ด และเมื่อพยายามเปิดอีกครั้งในอีกหลายปีต่อมา เขาจำรหัสผ่านไม่ได้
- ไฟล์หนึ่งที่เข้าถึงได้เป็นเวอร์ชันที่เก่ามาก ส่วนไฟล์ที่เหลือไม่สามารถแตกออกมาได้เพราะติดรหัสผ่าน
ไฟล์ PKZIP เก่าและ known-plaintext attack
- ไฟล์ที่ได้รับมาคือ ALLBAS.ZIP และ CODMAY93.ZIP ซึ่งทั้งสองไฟล์สร้างด้วย PKZIP ยุคแรกและมีรหัสผ่าน
- ZipCrypto ในรูปแบบ ZIP สมัยนั้นมี known-plaintext attack อยู่แล้ว และสามารถใช้โอเพนซอร์ส bkcrack ได้
- การโจมตีนี้ต้องคาดเดา plaintext 12 ไบต์ ที่อยู่ในตำแหน่งที่รู้ภายในไฟล์ ZIP
- ALLBAS.ZIP มีไฟล์
.BAS,.INC,.ZIP,.EXEหลายไฟล์อยู่ภายใน และบางรายการแสดงวิธีบีบอัดเป็น Store- รายการแบบ Store คือไฟล์ที่ไม่ได้ถูกบีบอัดเพราะเป็นไบนารีอยู่แล้ว จึงสามารถคาดเดา plaintext ได้โดยไม่ต้องเดาผลลัพธ์หลังบีบอัด
- ไฟล์ ZIP เองก็ถูกใส่ไว้เป็นรายการแบบ Store เช่นกัน และไฟล์ ZIP มีเฮดเดอร์ PK ที่ส่วนต้น จึงเหมาะสำหรับใช้เป็นผู้สมัคร plaintext
การหาผู้สมัคร plaintext: ชื่อไฟล์แรกของ ZIP ภายใน
- เป้าหมายการโจมตีคือไฟล์ ZIP ภายใน OLDCOD.ZIP ที่อยู่ใน ALLBAS.ZIP
- เฮดเดอร์ PK ที่จุดเริ่มต้นของไฟล์ ZIP มีข้อมูลอย่างความยาวชื่อไฟล์และความยาวฟิลด์เพิ่มเติม ดังนั้นหากรู้ชื่อไฟล์แรก ก็สามารถสร้าง plaintext ที่จำเป็นต่อการโจมตีได้
- หากชื่อไฟล์ยาวอย่างน้อย 8 ตัวอักษร เมื่อรวมกับนามสกุลอย่าง
.BASหรือ.INCและไบต์ของขนาดชื่อไฟล์กับความยาวฟิลด์เพิ่มเติม ก็จะได้ 12 ไบต์ที่ต้องการ - ในกรณีเลวร้ายที่สุด อาจ brute force ชื่อไฟล์ที่เป็นรูปแบบตัวพิมพ์ใหญ่กับตัวเลข ความยาวสูงสุด 8 ตัวอักษรพร้อมนามสกุลได้ แต่ในความเป็นจริงไม่จำเป็น
- Tim Jenkin มี OLDCOD.ZIP อีกเวอร์ชันหนึ่ง และสามารถบอกได้ว่าไฟล์แรกในนั้นคือ COMKEY.BAS
กู้คืนคีย์ด้วย bkcrack
- มีการเขียนโปรแกรม Perl แบบง่ายเพื่อใส่ COMKEY.BAS เป็นผู้สมัคร plaintext และรันการโจมตีในรูปแบบ
bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p ... -o 26 -j 8 - หลังจาก 23 นาที bkcrack พบคีย์ดังนี้
98e0f009 48a0b11a c70f8499
- ใช้คีย์เดียวกันถอดรหัส ALLBAS.ZIP เพื่อสร้าง ALLBAS-DECRYPTED.ZIP และคีย์เดียวกันก็ใช้กับ CODMAY93.ZIP ได้ด้วย จึงสร้าง CODMAY93-DECRYPTED.ZIP
- ยังมีทางเลือกอื่นคือโจมตีไฟล์ ZIP ภายในอื่น ๆ ด้วยวิธีเดียวกัน และหากยังล้มเหลวก็ลอง brute force ชื่อไฟล์
- ผู้สมัคร TECOD5.BAS ที่ตรวจสอบภายหลังพบคีย์เดียวกันได้ใน 38 วินาที แสดงว่าการเลือก plaintext ที่เหมาะสมมีผลอย่างมากต่อความเร็วของการโจมตี
การรันโค้ดที่ถอดรหัสแล้ว
- โปรแกรมทั้งสองถูกคอมไพล์ด้วย PowerBASIC และรันใน DOSBox
- RANDOM.BAS: ใช้สร้างดิสก์ตัวเลขสุ่มสำหรับใช้เป็น one-time pad
- TECOD.BAS: ใช้เข้ารหัสและถอดรหัสข้อความที่จะส่งทางอีเมล
- โค้ดที่คอมไพล์แล้วและไฟล์ปฏิบัติการที่สร้างขึ้นอยู่ที่ jgc-vula-september-2024
- คอมไพล์ด้วย PowerBASIC Compiler Version 3.00b โดย TECOD.BAS แสดงว่ามี 2,575 statements และ 2,329 บรรทัด ส่วน RANDOM.BAS มี 2,194 statements และ 1,940 บรรทัด
- RANDOM.EXE ใช้อัลกอริทึมสร้างเลขสุ่มสามแบบเพื่อสร้างข้อมูลสุ่ม โดยหนึ่งในนั้นอิงกับคีย์สุ่มที่ผู้ใช้ป้อนเอง
- TECOD.EXE ถูกป้องกันด้วยรหัสผ่าน และรหัสผ่านที่ฝังอยู่ในเวอร์ชันนี้คือ TIMBOBIMBO ซึ่งถูกเก็บในโค้ดโดยสลับลำดับตัวอักษร
- Tim Jenkin ใส่รหัสผ่านนี้ไว้ในโปรแกรมแบบเรียบง่ายแต่ทำ obfuscation
- รหัสผ่านจะแตกต่างกันไปในแต่ละเวอร์ชันของโปรแกรมที่ส่งให้สมาชิก ANC คนละกลุ่ม
- คู่มือสำหรับผู้ที่ต้องการลองรันเองอยู่ที่ TECOD_HLP.pdf
รายละเอียดที่เห็นจากวิธีใช้งานในเวลานั้น
- ตัวอย่างการรันมีลำดับคือใช้ RANDOM.EXE สร้างข้อมูลสุ่มสำหรับคีย์ไว้ใน RANDATA.1 จากนั้นเข้ารหัส PLAIN.TXT ให้เป็น PLAIN.BIN แล้วถอดกลับ
- งานเข้ารหัสทั้งหมดถูกออกแบบให้ทำบน RAM disk
- ในตัวอย่างการเข้ารหัส ไฟล์โปรแกรม
TECOD.EXEและTECOD.CNFอยู่ในฟลอปปีดิสก์ A:, ดิสก์ข้อมูลที่มีไฟล์คีย์อยู่ใน B: และ RAM disk อยู่ที่ R: - ในขั้นตอนเข้ารหัส ต้องเปลี่ยนชื่อไฟล์
RANDATA.1เป็น SNUM และในขั้นตอนถอดรหัสRANDATA.1ใน B: ต้องมีชื่อเป็น RNUM - โปรแกรมมีการทำลายข้อมูลคีย์หลังใช้งาน, ตรวจสอบการกระจายตัวของไบต์สุ่มที่สร้างขึ้น และเน้นการใช้ RAM disk
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สิ่งที่น่าสนใจเกี่ยวกับ Vula คือการขาดความง่ายในการใช้งานของระบบกลายเป็นสาเหตุของการล่มสลายในที่สุด
แม้แต่นักเคลื่อนไหวที่ทุ่มเทอย่างยิ่ง ซึ่งต่อสู้กับระบอบสังหารเพื่อเสรีภาพ ก็ยังใช้ระบบได้ไม่ถูกต้อง
เอกสารถูกทิ้งไว้โดยไม่เข้ารหัส คีย์ก็หาได้ง่าย และซอฟต์แวร์ยุ่งยากเกินไปจนการสื่อสารสำคัญบางส่วนถูกส่งเป็นข้อความธรรมดา
ทุกคนรู้ดีว่าการตั้งค่าและใช้ PGP ให้ถูกต้องนั้นปวดหัวแค่ไหน และท้ายที่สุด ความปลอดภัยก็คือความง่ายในการใช้งาน
บทความที่เขียนเพิ่มเติมเกี่ยวกับ Vula: https://shkspr.mobi/blog/2014/01/the-hardest-problem-in-encr...
ในกรณีส่วนใหญ่ ความง่ายในการใช้งานมักทำงานไปในทิศทางที่ ลดความปลอดภัยลง
ผมได้ดูตัวสร้างเลขสุ่มสำหรับ one-time pad ด้านความปลอดภัยแล้ว Melissa O'Neil น่าจะชอบทีเดียว มันเกือบจะเป็น PCG
ใช้ตัวสร้างแบบ linear congruential generator (LCG)
Randของระบบ PowerBASIC เพื่อเลือกหนึ่งในชุดฟังก์ชันrand1-3ใหม่ และในนั้นมีสองตัวที่ใช้ LCG ต่างกันhttps://github.com/Vulacode/RANDOM/blob/d6a1a1d694b22e6a115b...
ดูเหมือนตัวสร้างเลขสุ่มเทียมเหล่านี้ถูก seed ด้วยตัวสร้างเลขสุ่มของระบบ ดังนั้นสุดท้ายแค่กู้ seed เริ่มต้นของ LCG ระบบได้ ก็ reverse engineer one-time pad ได้
ไม่รู้ขนาด seed ของ LCG ระบบ แต่ถ้าเป็น 32 บิต ก็น่าจะ brute force สถานะ seed แล้วรัน การวิเคราะห์ entropy กับผลลัพธ์ จนอาจแกะได้ภายในหนึ่งชั่วโมง
“อย่าสร้างรหัสลับเอง” คือกฎข้อแรก แต่ในช่วงปลายยุค 80 ที่กำลังทำงานกับเทคโนโลยีใหม่สุดเท่ มันอาจดูเหมือนเป็นข้อยกเว้นได้
ภาพรวมของ การล่มสลายของ apartheid ในแอฟริกาใต้นั้นน่าสนใจมาก ผมแทบไม่รู้แง่มุมแบบนี้เลย
เกร็ดน่าสนใจคือขบวนการ BDS (boycott, divestment, sanctions) เริ่มต้นจากที่นี่ และในตอนนั้นคนส่วนใหญ่มองว่า apartheid จะไม่มีวันจบลง
แต่แรงกดดันที่ถูกส่งอย่างต่อเนื่องเป็นเวลานานในหลายจุดได้สร้างความตึงเครียดมหาศาล และนั่นนำไปสู่การล่มสลาย
อีกอย่างที่น่าสนใจคือ งานนี้ทำบน Toshiba T-100 ซึ่งเป็นคอมพิวเตอร์ที่เจ๋งมาก
น่าสนใจ แอฟริกาใต้ผ่านอะไรมามากจริง ๆ หวังว่า GNU ในปัจจุบันจะช่วยหมุนนาฬิกาวันสิ้นโลกให้ถอยกลับ
งานที่แนะนำคือ Action Kommandant ซึ่งทำให้ได้เห็นชีวิตของ Ashley Kriel ผู้พลีชีพและความภาคภูมิใจของ Bonteheuwel
ตอนเรียนภาษาอังกฤษระดับมัธยม ผมได้รู้จัก Athol Fugard ผ่านครูหัวรุนแรงคนหนึ่งที่หนีการเฝ้าระวังในยุค 80 จากแอฟริกาใต้ไปแคนาดา และมันเปิดโลกทัศน์ให้ผม
ขอให้ชาวแอฟริกาใต้โชคดีเช่นกัน ประเทศที่มีคนมีความสามารถและทรัพยากรธรรมชาติมากมายควรได้รับการปฏิบัติที่ดีกว่านี้มาก อย่างน้อยดูเหมือนว่ายุคการเมืองแข็งทื่อภายใน ANC จะจบลงแล้ว
โค้ด Rust สำหรับ brute force: https://github.com/rhulha/ZipMcKracken
Operation Vula, คอมพิวเตอร์ 8 บิต, เสียง DTMF, acoustic coupler — น่าสนใจจริง ๆCIA/NSA จับเค้าว่า Operation Vula ใช้ Philips PX-1000 เชิงพาณิชย์ที่มี DES ในตัว จึงติดสินบน Philips ให้ฝัง backdoor ลงในผลิตภัณฑ์: https://www.cryptomuseum.com/crypto/philips/px1000/
แทนที่จะใช้ DES ที่มี backdoor เขาใช้ one-time pad ที่ลูกเรือนำฟลอปปีดิสก์ไปส่งให้แต่ละฝ่าย
แม้ฟลอปปีดิสก์แบบนั้นสักแผ่นจะถูกจับได้ในแอฟริกาใต้ ก็จะเปิดเผยเฉพาะข้อความของผู้รับคนนั้น และสุดท้ายก็น่าจะตรวจพบได้ในไม่ช้า
แต่การสร้างคีย์ของ one-time pad ด้วย ตัวสร้างเลขสุ่มเทียม ก็เป็นวิธีที่ไร้เดียงสา
หัวใจของ one-time pad คือการใช้คีย์แบบสุ่มจริงเพื่อให้ได้ความปลอดภัยจริง ๆ คีย์แบบที่ใช้ที่นี่ หากแลกเปลี่ยนแค่ seed กันก็สร้างขึ้นในเครื่องได้อยู่แล้ว และถ้าทำเช่นนั้นก็ไม่ต้องทำให้ลูกเรือตกอยู่ในความเสี่ยง
เข้าใจได้ว่านักพัฒนาเรียนรู้เองและเรียนไประหว่างทำ แต่คนที่จัดการความลับสำคัญจริง ๆ ไม่ควรทำพลาดแบบนี้
อย่างไรก็ตาม การสร้างเลขสุ่มจริงจำนวนมากก็ไม่ใช่เรื่องง่าย สุดท้ายคงต้องสร้างอุปกรณ์ฮาร์ดแวร์เอง เพราะอุปกรณ์เชิงพาณิชย์ส่วนใหญ่มีความเป็นไปได้สูงว่าจะถูกดัดแปลง
ถ้าต้องแกะ รหัสผ่าน ZIP “แบบเก่า” และรู้ตัวอักษรบางตัวในอาร์ไคฟ์ ไม่มีอะไรดีกว่านี้แล้ว: https://github.com/kimci86/bkcrack