Đánh nhau bằng toán
(Hello Facebookers! Có vẻ như ai đó đã gửi bài này lên Facebook. Tôi thấy rất nhiều người đọc đến từ đó. Tôi thêm vào một phần tóm tắt để cho những ai không rành kỹ thuật dễ nắm bắt hơn.)
Tóm tắt: Juniper, một hãng chuyên bán các thiết bị mạng nổi tiếng của Mỹ, thông báo rằng có ai đó đã bí mật cài mã độc vào các thiết bị của họ. Mã độc này cho phép kẻ tấn công có thể truy cập từ xa vào các thiết bị này, đồng thời giải mã luôn các dữ liệu được gửi xuyên qua chúng. Sau quá trình tìm hiểu, người ta phát hiện ra một trong hai mã độc có liên quan đến giải thuật tạo số ngẫu nhiên Dual EC. Từ năm 2007 hai nhà nghiên cứu ở Microsoft đã chỉ ra rằng giải thuật này có thể đã bị NSA cài mã độc và điều đó sau này được xác nhận bởi các tài liệu do Edward Snowden tiết lộ. Ngoài Juniper thì RSA, một công ty chuyên bán các sản phẩm an toàn thông tin đình đám khác của Mỹ, cũng từng bị phát hiện cố tình sử dụng Dual EC trong các sản phẩm của họ, sau khi nhận 10 triệu USD từ NSA. Nếu bạn là chủ doanh nghiệp hay người chịu trách nhiệm về an toàn thông tin cho doanh nghiệp, nên suy nghĩ thật kỹ trước khi sử dụng các sản phẩm của RSA hoặc Juniper. Cách tốt nhất để tồn tại là đầu tư để tuyển dụng và đào tạo các chuyên gia tại chỗ, những người sẽ giúp bạn xây dựng các giải pháp dựa trên các nền tảng mở.
Nếu quan tâm đến công nghệ và an toàn thông tin, bạn nên mua vé tham dự TetCon 2016. Trong khuôn khổ hội thảo chúng tôi sẽ thảo luận Việt Nam cần phải làm gì để tự bảo vệ trước hiểm họa đến từ chiến tranh mạng.
--
Tuần vừa rồi lúc tôi đang chuẩn bị cho chuyến về Việt Nam thì 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. $P$ và $Q$ 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ì $P$ và $Q$ đượ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 $e$, từ $r * 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 $P$ và $Q$ 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.
Tóm tắt: Juniper, một hãng chuyên bán các thiết bị mạng nổi tiếng của Mỹ, thông báo rằng có ai đó đã bí mật cài mã độc vào các thiết bị của họ. Mã độc này cho phép kẻ tấn công có thể truy cập từ xa vào các thiết bị này, đồng thời giải mã luôn các dữ liệu được gửi xuyên qua chúng. Sau quá trình tìm hiểu, người ta phát hiện ra một trong hai mã độc có liên quan đến giải thuật tạo số ngẫu nhiên Dual EC. Từ năm 2007 hai nhà nghiên cứu ở Microsoft đã chỉ ra rằng giải thuật này có thể đã bị NSA cài mã độc và điều đó sau này được xác nhận bởi các tài liệu do Edward Snowden tiết lộ. Ngoài Juniper thì RSA, một công ty chuyên bán các sản phẩm an toàn thông tin đình đám khác của Mỹ, cũng từng bị phát hiện cố tình sử dụng Dual EC trong các sản phẩm của họ, sau khi nhận 10 triệu USD từ NSA. Nếu bạn là chủ doanh nghiệp hay người chịu trách nhiệm về an toàn thông tin cho doanh nghiệp, nên suy nghĩ thật kỹ trước khi sử dụng các sản phẩm của RSA hoặc Juniper. Cách tốt nhất để tồn tại là đầu tư để tuyển dụng và đào tạo các chuyên gia tại chỗ, những người sẽ giúp bạn xây dựng các giải pháp dựa trên các nền tảng mở.
Nếu quan tâm đến công nghệ và an toàn thông tin, bạn nên mua vé tham dự TetCon 2016. Trong khuôn khổ hội thảo chúng tôi sẽ thảo luận Việt Nam cần phải làm gì để tự bảo vệ trước hiểm họa đến từ chiến tranh mạng.
--
Tuần vừa rồi lúc tôi đang chuẩn bị cho chuyến về Việt Nam thì 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. $P$ và $Q$ 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ì $P$ và $Q$ đượ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 $e$, từ $r * 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 $P$ và $Q$ 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.
Comments
The theorem of Hasse-Weil ensures that the number of point on a certain elliptic curve is large enough for cryptographic applications (as long as \$p\$ is large enough). Let \$E(F_p)\$ be an elliptic curve defined over \$F_p\$, then \$\#E(F_p)=(p+1)-a\$, where \$a\$ is an integer that satisfies \$|a| \le 2sqrt{p}\$, that is called the (Frobenius) trace of \$E\$.
First, when the DLP is hard, at least, the order of the base group must be product of large prime numbers. But it cannot happen for all elliptic curves. For example, the curve \$E(F_p):y^2=x^3+x\$, where \$p \equiv 3 \mod 4\$ is a trace zero curve (supersingular curve). That means, \$#E(F_p)=p+1\$, when \$p=2^s-1\$ is a Mersene prime, then \$\#E(F_p) = 2^s\$. And the DLP on these curves will be very easy. In general, the DLP on supersingular curves can be transformed to the DLP over finite fields in polynomial time (via MOV attack).
When the number of points are large prime, it is also not enough. Let us consider curves of trace 1 (anomalous curves). In this case, \$#E(F_p)=p\$. But solving the DLP for these curves is even faster than MOV attack for supersingular curves.
Is it good to use ECC? Of course, but we should know it very carefully.