2 điểm bởi GN⁺ 2024-09-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • Tệp ZIP chứa mã nguồn ANC Operation Vula được lưu dưới dạng có mật khẩu từ năm 1991 đã được giải mã, mở đường cho việc công bố mã liên lạc bí mật dùng để chống lại chế độ apartheid ở Nam Phi
  • Mã này được dùng vào cuối thập niên 1980 để xây dựng mạng lưới ngầm của ANC bên trong Nam Phi, sử dụng máy tính 8-bit, âm DTMF, bộ ghép âm thanh và PowerBASIC để trao đổi các thông điệp mã hóa bằng one-time pad
  • ZipCrypto của PKZIP đời đầu dễ bị tấn công biết trước bản rõ, và bằng bkcrack người ta đã tìm ra 12 byte bản rõ có thể dự đoán trong ZIP để khôi phục khóa
  • Cuộc tấn công tận dụng mục Store không nén trong ALLBAS.ZIP, header PK của ZIP lồng bên trong, và tên tệp đầu tiên COMKEY.BAS; sau 23 phút đã thu được khóa 98e0f009 48a0b11a c70f8499
  • RANDOM.BAS và TECOD.BAS sau khi giải mã đã được biên dịch và chạy trong DOSBox, cho thấy cách tạo dữ liệu ngẫu nhiên, mã hóa/giải mã tệp, sử dụng RAM disk và hủy dữ liệu khóa sau khi dùng

Vì sao mã của Operation Vula bị khóa

  • Operation Vula là chiến dịch cuối thập niên 1980 nhằm đưa lãnh đạo ANC và vật tư vào Nam Phi, đồng thời xây dựng một mạng lưới ngầm kết nối các thành phần hoạt động trong nước
  • Để liên lạc an toàn, họ dùng máy tính 8-bit, âm DTMF, bộ ghép âm thanh, nhiều thiết bị khác nhau và chương trình PowerBASIC để trao đổi thông điệp mã hóa one-time pad
  • Tim Jenkin, người chủ yếu tạo ra hệ thống mật mã này, đã công bố mã gốc tại Vulacode GitHub, và mô tả chi tiết có trong Talking To Vula.pdf
  • Lý do trực tiếp khiến việc công bố mã bị trì hoãn là một tệp ZIP có mật khẩu được tạo vào năm 1991
    • Khi rời Anh để trở về Nam Phi, Tim Jenkin đã gom toàn bộ mã nguồn vào một tệp ZIP và đặt mật khẩu
    • Sau đó ở Nam Phi không cần mở lại mã, và vài năm sau khi muốn mở ra thì ông không còn nhớ mật khẩu
    • Một tệp có thể truy cập được là phiên bản rất sớm, còn lại thì không thể giải nén vì mật khẩu

Tệp PKZIP cũ và tấn công biết trước bản rõ

  • Hai tệp được chuyển giao là ALLBAS.ZIPCODMAY93.ZIP, cả hai đều được tạo bằng PKZIP đời đầu và có đặt mật khẩu
  • Khi đó định dạng ZIP với ZipCrypto tồn tại tấn công biết trước bản rõ, và có thể dùng bản triển khai mã nguồn mở bkcrack
  • Cuộc tấn công này cần dự đoán 12 byte bản rõ tại một vị trí đã biết bên trong tệp ZIP
  • Trong ALLBAS.ZIP có nhiều tệp .BAS, .INC, .ZIP, .EXE, và một số mục dùng phương thức nén Store
    • Mục Store là các tệp vốn đã ở dạng nhị phân nên không được nén, vì vậy có thể dự đoán bản rõ mà không cần khớp kết quả nén
    • Bản thân tệp ZIP cũng được chứa dưới dạng mục Store, và tệp ZIP có header PK ở phần đầu nên rất phù hợp làm ứng viên bản rõ

Tìm ứng viên bản rõ: tên tệp đầu tiên trong ZIP bên trong

  • Mục tiêu tấn công là tệp ZIP lồng bên trong OLDCOD.ZIP nằm trong ALLBAS.ZIP
  • Trong header PK ở đầu tệp ZIP có cả độ dài tên tệp và độ dài trường bổ sung, nên nếu biết tên tệp đầu tiên thì có thể dựng bản rõ cần cho cuộc tấn công
  • Nếu tên tệp dài ít nhất 8 ký tự, thì cùng với phần mở rộng như .BAS, .INC và các byte độ dài tên tệp, độ dài trường bổ sung, sẽ đủ 12 byte cần thiết
  • Trong trường hợp xấu nhất, cũng có thể brute-force tên tệp theo dạng chữ in hoa và số, tối đa 8 ký tự cộng phần mở rộng, nhưng thực tế không cần đến
  • Tim Jenkin có một phiên bản khác của OLDCOD.ZIP và có thể cho biết tệp đầu tiên bên trong là COMKEY.BAS

Khôi phục khóa bằng bkcrack

  • Một chương trình Perl đơn giản đã được viết để đưa COMKEY.BAS vào làm ứng viên bản rõ, rồi chạy tấn công theo dạng bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p ... -o 26 -j 8
  • Sau 23 phút, bkcrack tìm được các khóa sau
    • 98e0f009 48a0b11a c70f8499
  • Dùng cùng khóa đó để giải mã ALLBAS.ZIP và tạo ALLBAS-DECRYPTED.ZIP; khóa này cũng hoạt động với CODMAY93.ZIP để tạo CODMAY93-DECRYPTED.ZIP
  • Phương án khác là tấn công các tệp ZIP lồng bên trong khác theo cách tương tự, và nếu vẫn thất bại thì thử brute-force tên tệp
  • Ứng viên TECOD5.BAS được kiểm tra sau đó đã tìm ra cùng khóa chỉ trong 38 giây, cho thấy việc chọn bản rõ phù hợp ảnh hưởng lớn đến tốc độ tấn công

Chạy mã sau khi giải mã

  • Hai chương trình đã được biên dịch và chạy bằng PowerBASIC trong DOSBox
    • RANDOM.BAS: dùng để tạo đĩa số ngẫu nhiên phục vụ one-time pad
    • TECOD.BAS: dùng để mã hóa và giải mã các thông điệp gửi qua email
    • Mã đã biên dịch và các tệp thực thi tạo ra có tại jgc-vula-september-2024
  • Mã được biên dịch bằng PowerBASIC Compiler Version 3.00b; TECOD.BAS hiển thị 2.575 câu lệnh và 2.329 dòng, còn RANDOM.BAS là 2.194 câu lệnh và 1.940 dòng
  • RANDOM.EXE sử dụng ba kiểu thuật toán sinh số ngẫu nhiên để tạo dữ liệu ngẫu nhiên, trong đó một kiểu dựa trên khóa ngẫu nhiên do người dùng tự nhập
  • TECOD.EXE được bảo vệ bằng mật khẩu, và mật khẩu nhúng trong phiên bản này là TIMBOBIMBO, được lưu rải thứ tự ký tự trong mã
    • Tim Jenkin đã đưa mật khẩu này vào chương trình theo cách đơn giản nhưng có làm rối
    • Mật khẩu khác nhau giữa các phiên bản chương trình được phân phát cho các thành viên ANC khác nhau
  • Hướng dẫn dành cho người muốn tự chạy có trong TECOD_HLP.pdf

Những chi tiết được hé lộ về cách vận hành khi đó

  • Ví dụ chạy thử cho thấy quy trình dùng RANDOM.EXE để tạo dữ liệu ngẫu nhiên cho khóa trong RANDATA.1, mã hóa PLAIN.TXT thành PLAIN.BIN, rồi giải mã ngược lại
  • Mọi thao tác mật mã đều được thiết kế để thực hiện trên RAM disk
  • Trong ví dụ mã hóa, các tệp chương trình TECOD.EXETECOD.CNF nằm trên đĩa mềm A:, đĩa dữ liệu chứa tệp khóa nằm ở B:, và RAM disk là R:
  • Ở bước mã hóa, tên tệp RANDATA.1 phải được đổi thành SNUM; còn ở bước giải mã, RANDATA.1 trên B: phải mang tên RNUM
  • Chương trình có cả chức năng hủy dữ liệu khóa sau khi dùng, kiểm tra phân bố byte ngẫu nhiên được tạo ra, và nhấn mạnh việc sử dụng RAM disk

1 bình luận

 
GN⁺ 2024-09-08
Các ý kiến trên Hacker News
  • Điểm thú vị ở Vula là việc hệ thống thiếu tính dễ dùng rốt cuộc lại trở thành nguyên nhân dẫn đến thất bại
    Ngay cả những nhà hoạt động cực kỳ tận tụy, đối đầu với một chế độ tàn bạo vì tự do, cũng không thể dùng hệ thống cho đúng
    Tài liệu bị để lại mà không mã hóa, khóa thì có thể dễ dàng lấy được, còn phần mềm quá rườm rà đến mức một số liên lạc quan trọng được gửi dưới dạng văn bản thuần
    Ai cũng biết việc thiết lập và dùng PGP đúng cách phiền phức thế nào, và suy cho cùng bảo mật chính là tính dễ dùng
    Một bài viết thêm đôi chút về Vula: https://shkspr.mobi/blog/2014/01/the-hardest-problem-in-encr...

    • Hãy tưởng tượng nếu làm mất chìa khóa nhà thì bạn sẽ không bao giờ vào nhà được nữa
      Trong đa số trường hợp, tính dễ dùng thường tác động theo hướng làm giảm mức độ bảo mật
  • Tôi đã xem bộ sinh số ngẫu nhiên cho one-time pad dùng cho bảo mật, và Melissa O'Neil hẳn sẽ thích nó. Gần như là PCG
    Nó dùng bộ sinh đồng dư tuyến tính (LCG) Rand của hệ thống PowerBASIC để chọn một trong bộ hàm rand1-3 mới, trong đó hai hàm dùng các LCG khác nhau
    https://github.com/Vulacode/RANDOM/blob/d6a1a1d694b22e6a115b...

    • Cách tạo one-time pad đó trông khá tệ. Có vẻ hoàn toàn có thể khôi phục trạng thái seed của các bộ sinh khác nhau, và LCG thì rất dễ dịch ngược
      Vì các bộ sinh số giả ngẫu nhiên dường như được seed bằng bộ sinh ngẫu nhiên của hệ thống, nên cuối cùng chỉ cần khôi phục seed ban đầu của LCG hệ thống là có thể dịch ngược one-time pad
      Tôi không biết kích thước seed của LCG hệ thống, nhưng nếu là 32-bit thì có lẽ chỉ cần brute-force trạng thái seed rồi chạy phân tích entropy trên kết quả là có thể phá trong vòng một giờ
    • Cũng phải kể rằng lập trình viên ban đầu đã viết nó trong lúc tự học mật mã học và BASIC ngay tại chỗ
      “Đừng tự chế mật mã” là quy tắc đầu tiên, nhưng trong bối cảnh cuối thập niên 80, khi đang xử lý một công nghệ mới rất ngầu, có lẽ điều đó trông như một ngoại lệ
    • Dĩ nhiên là nó hoàn toàn không đủ tốt để dùng như one-time pad thực sự
  • Toàn bộ quá trình sụp đổ của chế độ apartheid ở Nam Phi khá thú vị. Tôi gần như không biết gì về khía cạnh này
    Một sự thật thú vị là phong trào BDS (tẩy chay, thoái vốn, trừng phạt) bắt đầu từ đây, và khi đó đa số cho rằng apartheid sẽ không bao giờ chấm dứt
    Nhưng áp lực được duy trì trong thời gian dài tại nhiều điểm gây sức ép khác nhau, tạo ra căng thẳng lớn, và điều đó dẫn đến sự sụp đổ
    Việc công việc này được thực hiện trên Toshiba T-100 cũng khá thú vị; đó là một chiếc máy tính rất hay

  • Thú vị thật. Nam Phi đã trải qua rất nhiều chuyện. Hy vọng GNU hiện nay sẽ kéo đồng hồ tận thế lùi lại
    Tác phẩm nên xem là Action Kommandant. Nó cho thấy một góc nhìn về cuộc đời của Ashley Kriel, một liệt sĩ và niềm tự hào của Bonteheuwel

    • Rất vui khi biết đến tên Ashley Kriel. Cuộc đời và tài năng đa dạng của những đồng chí tài năng từng sát cánh cùng ANC thường bị che khuất, nên tôi rất quan tâm đến việc tìm hiểu những nhân vật như vậy
      Trong giờ tiếng Anh ở trung học, tôi biết đến Athol Fugard nhờ một giáo viên cấp tiến đã rời Nam Phi sang Canada để tránh sự giám sát trong thập niên 80, và điều đó đã mở rộng tầm mắt tôi
      Chúc người dân Nam Phi may mắn. Một đất nước có nhiều người tài năng và tài nguyên thiên nhiên đáng lẽ phải được đối xử tốt hơn nhiều. Ít nhất thì có vẻ thời kỳ chính trị cứng nhắc bên trong ANC đã kết thúc
  • Mã Rust để brute-force: https://github.com/rhulha/ZipMcKracken

  • Operation Vula, máy tính 8-bit, âm DTMF, bộ ghép âm thanh — thú vị thật
    CIA/NSA nhận ra dấu hiệu rằng Operation Vula được vận hành bằng Philips PX-1000 thương mại có DES tích hợp, nên đã hối lộ Philips để cài cửa hậu vào sản phẩm: https://www.cryptomuseum.com/crypto/philips/px1000/

    • Tim Jenkins đã vòng qua vấn đề đó bằng cách dùng hệ thống riêng và mật mã riêng
      Không dùng DES có cửa hậu, mà dùng one-time pad do tiếp viên hàng không vận chuyển bằng đĩa mềm đến từng bên
      Nếu một đĩa mềm như vậy bị bắt ở Nam Phi, thì chỉ các tin nhắn của người nhận đó bị lộ, và cuối cùng chuyện này cũng có thể sớm bị phát hiện
    • Dùng bất kỳ công nghệ mã hóa thương mại nào thì nhìn chung có thể xem như xong đời
      Nhưng tạo khóa one-time pad bằng bộ sinh số giả ngẫu nhiên là một cách làm ngây thơ
      Điểm cốt lõi của one-time pad là dùng khóa thật sự ngẫu nhiên để có được bảo mật đúng nghĩa. Với kiểu khóa được dùng ở đây, chỉ cần trao đổi seed là có thể tạo cục bộ, và như thế đã không cần đặt các tiếp viên vào nguy hiểm
      Tôi hiểu là nhà phát triển tự học và còn học trong lúc làm, nhưng nếu xử lý những bí mật thật sự quan trọng thì không nên mắc sai lầm như vậy
      Tuy vậy, tạo ra lượng lớn số ngẫu nhiên thật cũng không dễ. Cuối cùng có lẽ phải tự chế thiết bị phần cứng, vì phần lớn thiết bị thương mại rất có khả năng đã bị can thiệp
  • Nếu phải phá mật khẩu ZIP “cũ” và biết vài ký tự bên trong archive, thì không gì tốt hơn cái này: https://github.com/kimci86/bkcrack

    • Không phải toàn bộ bài viết chính là về chương trình đó sao?