Đánh nhau bằng toán

Tuần vừa xảy ra một sự kiện cực kỳ lý thú: Juniper công bố các thiết bị VPN của họ đã bị cài backdoor (tức là ai đó cố tình tạo ra một lổ hổng để họ có thể bí mật kiểm soát các thiết bị này) từ năm 2012.

Sự kiện này là một trường hợp cho thấy tin tưởng mù quáng vào các thiết bị an ninh, nhất là các thiết bị mã nguồn đóng, thường là sai lầm lớn nhất khi làm quản lý an toàn thông tin. Cách đây nhiều năm khi viết về tường lửa (firewall) tôi có nói thế này:

<quote>

Firewall, về bản chất, cũng chỉ là một software chạy trên một hardware, mà đã là software, do con người tạo ra, thì thể nào cũng sẽ có lỗi. Kinh nghiệm của tôi cho thấy, nơi nào mà có software chạy, từ máy ATM cho đến các vệ tinh, nơi đó sẽ có bug, và có thể trong số các bug này, sẽ có những bug gây nguy hại đến sự an toàn của hệ thống.

Đương nhiên, các software, cụ thể là các hệ điều hành, chạy trên firewall thường rất nhỏ gọn, thường đã được kiện toàn trước khi xuất xưởng, và không phổ biến như Windows, Linux hay Mac, thành ra kiến thức về cách thức chúng hoạt động cũng như các kỹ thuật tìm kiếm và khai thác lỗ hổng bảo mật cũng không phổ biến đại trà.

Nhưng tất cả chỉ là vấn đề thời gian (và tiền bạc) mà thôi. Chẳng hạn như đối với Cisco IOS, từ năm 2005, Michale Lynn đã công bố các phương thức khai thác lỗi của nó (trước đó có FX từ năm 2003 đã có những research hoàn chỉnh về Cisco IOS). Kể từ đó đến nay, đã có rất nhiều research của các hãng và cá nhân tên tuổi trên thế giới về các lỗ hổng bảo mật trên hệ điều hành này của Cisco. Thậm chí gần đây, người ta còn phát triển được cả rootkit trên IOS.

</quote>

VPN là giải pháp truy cập từ xa vào hệ thống mạng nội bộ. Thông qua VPN một nhân viên ngồi ở nhà, hoặc quán cafe, có thể truy cập vào hệ thống mạng nội bộ của công ty như bình thường. Thiết bị VPN là dạng thiết bị trọng yếu bật nhất trong hệ thống thông tin của một công ty. Tài khoản truy cập VPN thường gắn liền với tài khoản email, ngoài ra với vị trí cầu nối giữa Internet và hệ thống nội bộ, thiết bị VPN thấy toàn bộ những dữ liệu nhạy cảm (bao gồm mật khẩu, văn bản, hình ảnh, v.v.) mà nhân viên công ty tải về máy tính cá nhân của họ. Ai kiểm soát được các thiết bị này thì coi như kiểm soát được tất cả thông tin mật của công ty.

Sau khi reverse engineering firmware của Juniper, người ta phát hiện ra hai backdoor: một backdoor cho phép truy cập từ xa mà không cần biết mật khẩu (chi tiết) và một backdoor cho phép những ai quan sát được dữ liệu (đã mã hóa) đi xuyên qua các thiết bị VPN có thể dễ dàng giải mã chúng. Với backdoor đầu, coi như ai cũng có thể điều khiển các thiết bị VPN của Juniper, rất nguy hiểm nhưng về mặt kỹ thuật cũng không có gì đặc sắc, nhưng backdoor thứ hai thì cực kỳ thú vị.

Mật mã học hiện đại phụ thuộc rất lớn vào các bộ tạo số ngẫu nhiên. Mỗi lần bạn truy cập vào Facebook, máy tính của bạn và máy chủ Facebook liên tục tạo ra các số ngẫu nhiên và sử dụng chúng để mã hóa dữ liệu truyền giữa hai phía. Cũng tương tự như vậy, khi một nhân viên truy cập vào hệ thống VPN, máy tính của họ và thiết bị VPN cũng liên tục tạo ra các số ngẫu nhiên để mã hóa dữ liệu truyền qua lại.

Ai đã từng lập trình sẽ hiểu tạo số ngẫu nhiên trên máy tính không đơn giản chút nào. Các hệ điều hành và các thư viện phần mềm thường cung cấp sẵn các hàm tạo số ngẫu nhiên, nhưng bạn có bao giờ thắc mắc các hàm này được lập trình ra sao chưa? Nói cách khác, bây giờ nếu không gọi các hàm có sẵn, bạn sẽ làm gì để tạo ra một số ngẫu nhiên trong chương trình của bạn? Bạn sẽ nhận ra rằng bất kể thuật toán của bạn là gì, nó sẽ là tất định, đầu vào hoàn toàn quyết định đầu ra, không có cách chi để bạn lập trình máy tính trả về một số ngẫu nhiên cả. Nếu đơn giản, Knuth đã không dành hẳn một chương trong bộ The Art of Computer Programming để bàn về các thuật toán tạo số ngẫu nhiên.

Các bộ tạo số ngẫu nhiên là những thuật toán tất định (deterministic algorithm) sử dụng một trong hai mẹo để tạo ra sự ngẫu nhiên:

* ghi nhớ số ngẫu nhiên đã tạo trước đó và các số tạo tiếp theo sẽ phụ thuộc vào số tạo trước nó. Tôi sẽ không bàn về kỹ thuật này ở đây, ai hứng thú có thể xem thêm bộ tạo số ngẫu nhiên đồng dư tuyến tính.

* sử dụng các phần cứng đặc biệt để tạo ra số ngẫu nhiên đầu tiên (thường được gọi là seed, hạt giống), các số ngẫu nhiên tiếp theo sẽ phụ thuộc vào hạt giống ban đầu. Đây là kỹ thuật của các bộ tạo số ngẫu nhiên dùng trong mật mã và cũng được sử dụng bởi các thiết bị VPN của Juniper.

Các CPU hiện đại thường có sẵn một mô-đun để tạo số ngẫu nhiên, dựa vào các sự kiện ngẫu nhiên mà CPU quan sát được, ví dụ như số lần instruction mov eax, eax được thực thi trong 1s vừa rồi, hay các hiện tượng vật lý (xem thêm bộ tạo số ngẫu nhiên thực). Các số ngẫu nhiên được tạo ra ở trong CPU hoàn toàn không thể dự đoán được, nhưng các bộ tạo số này thường rất chậm, do phải phụ thuộc vào môi trường, thường không đáp ứng được nhu cầu của hệ điều hành và các phần mềm chạy ở trên hệ điều hành (ví dụ như trình duyệt, v.v). Do đó người ta chỉ dùng các số ngẫu nhiên do CPU tạo ra để làm hạt giống cho các bộ tạo số ngẫu nhiên bằng phần mềm. Ví dụ như trên Linux, có bộ /dev/urandom

$ cat /dev/urandom

Từ đây về sau tôi dùng từ bộ tạo số ngẫu nhiên để chỉ các bộ tạo số ngẫu nhiên bằng phần mềm, tương tự như /dev/urandom.

Tiêu chuẩn quan trọng nhất của các bộ tạo số ngẫu nhiên là không thể dự đoán. Nếu chỉ cần quan sát một vài số đã được tạo ra mà có thể dự đoán được những số sẽ được tạo ra tiếp theo (hoặc là trước đó), bộ tạo số coi như không đủ tiêu chuẩn để dùng trong mật mã. Có nhiều thuật toán ngẫu nhiên, nhưng Juniper chọn thuật toán có tên là Dual EC. Trên danh nghĩa đây là thuật toán được thiết kế và chuẩn hóa bởi Viện Tiêu Chuẩn Công Nghệ Mỹ (NIST), nhưng các tài liệu của Edward Snowden chỉ ra rằng thuật toán này được thiết kế bởi Cục An Ninh Quốc Gia Mỹ (NSA). Vấn đề là NSA đã cài một backdoor vào thuật toán này, giúp họ có thể dự đoán được những số sẽ được tạo ra chỉ bằng cách quan sát một số trước đó.

Mặc dù Dual EC có thể đọc thành DỞ ẸC, nhưng chữ EC thật ra có nghĩa là elliptic curve. Dual EC sử dụng nhóm các điểm trên đường cong elliptic curve để tạo số ngẫu nhiên. Thuật toán này có hai bước đơn giản

* Từ một số ngẫu nhiên r, tạo ra số ngẫu nhiên kế tiếp bằng cách tính r * Q, tức cộng dồn điểm Q r lần.

* Thay thế r bằng r * P.

Lưu ý nếu biết r thì có thể dự đoán được tất cả các số sẽ được tạo ra tiếp theo.

Mô tả của tôi về thuật toán Dual EC không chính xác 100%, nhưng đủ chính xác để giới thiệu backdoor. PQ là hai điểm cho trước trên đường cong. NSA chọn P là một hằng số không có gì đáng nghi ngờ, nhưng không giải thích nguồn gốc của Q. Hai nhà nghiên cứu của Microsoft chỉ ra từ 2007 rằng nếu Q không được chọn ngẫu nhiên, NSA có thể dự đoán được tất cả các số sẽ được tạo ra tiếp theo, chỉ bằng cách quan sát một số đã được tạo ra trước đó. Vì PQ được định nghĩa trên đường cong có tên là P-256, nên tồn tại một số $e$, sao cho e * Q = P. Nếu biết được er * Q NSA có thể tính r * Q * e = r * P, tức là đã tính được r và từ đó có thể dự đoán được tất cả những số ngẫu nhiên sẽ được tạo ra. Vì NSA chọn PQ nên chắc chắn họ biết e.

Nếu bài toán logarithm rời rạc trên nhóm các điểm trên đường cong elliptic là khó, ngoài NSA ra không ai có thể sử dụng backdoor này. Đây là dạng backdoor NOBUS (No One But Us) được chính phủ Mỹ và các nước ưa thích. Vấn đề của NSA là làm sao thuyết phục được các công ty sử dụng Dual EC. Thuật toán này chạy rất chậm và ngoài backdoor này ra, nó còn có vài vấn đề an ninh khác. Do đó khi Edward Snowden xác nhận Dual EC đích thực bị NSA cài backdoor, lúc đầu người ta nghĩ chắc không ai sử dụng nó đâu.

Rốt cuộc người ta phát hiện có ít nhất 4 công ty Mỹ có đính kèm Dual EC vào các sản phẩm của họ: Microsoft, Cisco, RSA và bây giờ là Juniper. Tôi không rõ Cisco sử dụng Dual EC như thế nào, nhưng Microsoft không sử dụng chúng như là bộ tạo số mặc định (người dùng phải chỉnh một cờ trong registry để kích hoạt bộ tạo số này). RSA là một trường hợp rất thú vị. RSA bán một bộ thư viện mật mã mang tên là BSAFE và BSAFE sử dụng Dual EC là bộ tạo số mặc định. Nói cách khác, ai sử dụng sản phẩm của RSA coi như đã bị chính phủ Mỹ nắm đầu. Người ta còn phát hiện ra một hợp đồng bí mật trị giá 10 triệu USD mà NSA trả cho RSA để cài Dual EC vào BSAFE. Tóm lại chỉ có khùng (hoặc giả khùng ngậm tiền) mới tiếp tục sử dụng sản phẩm của RSA.

Cái cách mà Juniper sử dụng Dual EC cũng rất lý thú. Họ dùng nó một cách gián tiếp. Họ tạo ra một số ngẫu nhiên từ Dual EC, rồi sử dụng số đó để làm hạt giống cho một bộ tạo số khác, nhanh hơn, an toàn hơn và không có backdoor. Tại sao? Chẳng ai biết! Không có lý do gì để Juniper làm như vậy cả, ngoại trừ khi họ bị ép buộc phải sử dụng Dual EC (hoặc, như RSA, có hợp đồng bí mật với NSA). Đặc biệt nhất, Juniper không sử dụng Q do NSA chỉ định, mà lại tự định nghĩa một hằng số  Q' khác. Vấn đề là Juniper không thể chỉ ra Q' đã được tạo ra như thế nào. Không ai có bằng chứng chuyện gì đã diễn ra, nhưng chỉ có hai giả thuyết:

* Juniper tự tạo Q' cho riêng mình để loại trừ backdoor của NSA.

* NSA tạo Q' và yêu cầu Juniper sử dụng Q'.

Nhắc lại, chẳng có lý do chính đáng để sử dụng Dual EC, nên nếu Juniper muốn xóa backdoor, cách đơn giản hơn là không sử dụng Dual EC. Thành ra giả thuyết thứ hai có vẻ mạnh hơn. Có thể NSA không muốn gom tất cả trứng để vào một rổ, hoặc họ muốn chia sẻ backdoor trên thiết bị VPN của Juniper của họ với đối tác mà không muốn tiết lộ cách tạo Q, vì thông tin đó có liên quan đến backdoor ở nhiều thiết bị khác nữa, không riêng gì VPN.

Không ai biết Juniper bắt đầu sử dụng Dual EC từ khi nào, nhưng năm 2012 xảy ra một sự kiện quan trọng. Một nhân viên nào đó của Juniper hoặc một ai đó xâm nhập vào hệ thống của họ đã bí mật đổi Q' thành Q''. Juniper mới (?) phát hiện ra chuyện này cách đây vài tuần và thông báo của họ đã khơi nguồn cho bài blog này.

Ai đã đổi Q' thành Q''? Có phải Juniper mới phát hiện ra không, hay là họ đã biết từ lâu nhưng không nói gì? Tại sao lại chọn công bố ngay giữa lúc ở Mỹ đang có cuộc tranh luận lớn về chuyện chính phủ Mỹ có được quyền gài backdoor vào các tiêu chuẩn mật mã hay không?

Không có ai có đủ thông tin để trả lời những câu hỏi này. Tôi nghĩ chính NSA đã đổi Q' thành Q''. Nếu NSA kiểm soát Q' như đã bàn ở trên và vào năm 2012 một ai đó (Trung Quốc chẳng hạn) đổi Q' thành Q'', tức là backdoor của NSA đã bị vô hiệu hóa trong suốt 5 năm qua mà họ không hay biết gì sao? Tôi nghĩ khó có khả năng đó. Ngược lại, nếu NSA đổi Q' thành Q'' thì backdoor của họ vẫn còn hiệu lực trong suốt thời gian qua.

Khi phát hiện ra có người đổi Q' sang Q'', Juniper sửa lại bằng cách đổi trở lại Q'. Có thể họ có hợp đồng với NSA? Chẳng ai biết tại sao họ không bỏ Dual EC đi quách cho rồi! Hơn nữa, để khai thác được backdoor này, kẻ tấn công phải quan sát được r * Q, nhưng điều đó là không thể nếu như Juniper chỉ sử dụng Dual EC để tạo hạt giống cho một bộ tạo số khác (như đã nói ở trên). Vấn đề là trong mã nguồn của Juniper còn có một lổ hổng khác (một backdoor thứ ba, không biết được cài từ hồi nào) tiết lộ giá trị của r * Q. Juniper không hề đả động gì đến lổ hổng này trong các thông báo sửa lỗi của họ. Tại sao? Không ai biết cả.

Một vị quan chức ngành an toàn thông tin có lần hỏi tôi có nên tin tưởng các thiết bị của nước ngoài hay không. Tôi có nói xét ở bình diện an ninh quốc gia thì chẳng thể tin tưởng ai cả. Chỉ có cách duy nhất là tuyển dụng đào tạo đội ngũ kỹ sư lành nghề để họ xây dựng giải pháp dựa trên các nền tảng mở sẵn có.

Đối với doanh nghiệp thì thú thật tôi cũng không có giải pháp nào khác ngoại trừ việc thuê mướn đào tạo tuyển dụng chuyên gia. Doanh nghiệp nhỏ thì hi vọng là chẳng ai để ý đến mình, còn doanh nghiệp lớn, có làm ăn mua bán với nước ngoài thì chỉ có cách đầu tư mạnh để thu hút chất xám công nghệ mà thôi.

Nếu bạn thích những chủ đề như vầy, bạn nên mua vé tham dự TetCon 2016.

Chủ đề : Chưa phân loạiBookmark the permalink. Trackbacks are closed, but you can post a comment.

Post a Comment

Your email is never published nor shared. Required fields are marked *

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*
*