2 คะแนน โดย GN⁺ 2024-09-08 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-09-08
ความคิดเห็นบน 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...

    • วิธี สร้าง one-time pad แบบนั้นดูค่อนข้างแย่ น่าจะกู้คืนสถานะ seed ของตัวสร้างต่าง ๆ ได้ไม่ยากพอสมควร และ LCG ก็ reverse engineer ได้ง่ายมาก
      ดูเหมือนตัวสร้างเลขสุ่มเทียมเหล่านี้ถูก seed ด้วยตัวสร้างเลขสุ่มของระบบ ดังนั้นสุดท้ายแค่กู้ seed เริ่มต้นของ LCG ระบบได้ ก็ reverse engineer one-time pad ได้
      ไม่รู้ขนาด seed ของ LCG ระบบ แต่ถ้าเป็น 32 บิต ก็น่าจะ brute force สถานะ seed แล้วรัน การวิเคราะห์ entropy กับผลลัพธ์ จนอาจแกะได้ภายในหนึ่งชั่วโมง
    • อีกประเด็นคือโปรแกรมเมอร์ดั้งเดิมเขียนมันขึ้นมาขณะเรียนรู้ cryptography และ BASIC แบบเฉพาะหน้า
      “อย่าสร้างรหัสลับเอง” คือกฎข้อแรก แต่ในช่วงปลายยุค 80 ที่กำลังทำงานกับเทคโนโลยีใหม่สุดเท่ มันอาจดูเหมือนเป็นข้อยกเว้นได้
    • แน่นอนว่ามันยังห่างไกลจากความเพียงพอสำหรับใช้เป็น one-time pad จริง ๆ
  • ภาพรวมของ การล่มสลายของ apartheid ในแอฟริกาใต้นั้นน่าสนใจมาก ผมแทบไม่รู้แง่มุมแบบนี้เลย
    เกร็ดน่าสนใจคือขบวนการ BDS (boycott, divestment, sanctions) เริ่มต้นจากที่นี่ และในตอนนั้นคนส่วนใหญ่มองว่า apartheid จะไม่มีวันจบลง
    แต่แรงกดดันที่ถูกส่งอย่างต่อเนื่องเป็นเวลานานในหลายจุดได้สร้างความตึงเครียดมหาศาล และนั่นนำไปสู่การล่มสลาย
    อีกอย่างที่น่าสนใจคือ งานนี้ทำบน Toshiba T-100 ซึ่งเป็นคอมพิวเตอร์ที่เจ๋งมาก

  • น่าสนใจ แอฟริกาใต้ผ่านอะไรมามากจริง ๆ หวังว่า GNU ในปัจจุบันจะช่วยหมุนนาฬิกาวันสิ้นโลกให้ถอยกลับ
    งานที่แนะนำคือ Action Kommandant ซึ่งทำให้ได้เห็นชีวิตของ Ashley Kriel ผู้พลีชีพและความภาคภูมิใจของ Bonteheuwel

    • ดีใจที่ได้รู้จักชื่อของ Ashley Kriel ชีวิตและพรสวรรค์หลากหลายของเพื่อนร่วมงานที่มีความสามารถซึ่งร่วมทางกับ ANC มักถูกบดบังอยู่บ่อย ๆ ผมจึงสนใจเรียนรู้เกี่ยวกับบุคคลเหล่านี้มาก
      ตอนเรียนภาษาอังกฤษระดับมัธยม ผมได้รู้จัก 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/

    • Tim Jenkins เลี่ยงปัญหานั้นด้วยการใช้ระบบและรหัสลับของตัวเอง
      แทนที่จะใช้ DES ที่มี backdoor เขาใช้ one-time pad ที่ลูกเรือนำฟลอปปีดิสก์ไปส่งให้แต่ละฝ่าย
      แม้ฟลอปปีดิสก์แบบนั้นสักแผ่นจะถูกจับได้ในแอฟริกาใต้ ก็จะเปิดเผยเฉพาะข้อความของผู้รับคนนั้น และสุดท้ายก็น่าจะตรวจพบได้ในไม่ช้า
    • ถ้าใช้เทคโนโลยีเข้ารหัสเชิงพาณิชย์ ไม่ว่าแบบใด โดยทั่วไปก็ถือว่าจบเห่ได้เลย
      แต่การสร้างคีย์ของ one-time pad ด้วย ตัวสร้างเลขสุ่มเทียม ก็เป็นวิธีที่ไร้เดียงสา
      หัวใจของ one-time pad คือการใช้คีย์แบบสุ่มจริงเพื่อให้ได้ความปลอดภัยจริง ๆ คีย์แบบที่ใช้ที่นี่ หากแลกเปลี่ยนแค่ seed กันก็สร้างขึ้นในเครื่องได้อยู่แล้ว และถ้าทำเช่นนั้นก็ไม่ต้องทำให้ลูกเรือตกอยู่ในความเสี่ยง
      เข้าใจได้ว่านักพัฒนาเรียนรู้เองและเรียนไประหว่างทำ แต่คนที่จัดการความลับสำคัญจริง ๆ ไม่ควรทำพลาดแบบนี้
      อย่างไรก็ตาม การสร้างเลขสุ่มจริงจำนวนมากก็ไม่ใช่เรื่องง่าย สุดท้ายคงต้องสร้างอุปกรณ์ฮาร์ดแวร์เอง เพราะอุปกรณ์เชิงพาณิชย์ส่วนใหญ่มีความเป็นไปได้สูงว่าจะถูกดัดแปลง
  • ถ้าต้องแกะ รหัสผ่าน ZIP “แบบเก่า” และรู้ตัวอักษรบางตัวในอาร์ไคฟ์ ไม่มีอะไรดีกว่านี้แล้ว: https://github.com/kimci86/bkcrack

    • บทความทั้ง篇ไม่ได้พูดถึงโปรแกรมนั้นอยู่แล้วเหรอ?