Saturday, May 21, 2011

Oakland 2011

Tuần sau tôi sẽ trình bày ở hội thảo Oakland 2011 với paper "Cryptography in the Web: The Case of Cryptographic Design Flaws in ASP.NET":
This paper discusses how cryptography is misused in the security design of a large part of the Web. Our focus is on ASP.NET, the web application framework developed by Microsoft that powers 25% of all Internet web sites. We show that attackers can abuse multiple cryptographic design flaws to compromise ASP.NET web applications. We describe practical and highly efficient attacks that allow attackers to steal cryptographic secret keys and forge authentication tokens to access sensitive information. The attacks combine decryption oracles, unauthenticated encryptions, and the reuse of keys for different encryption purposes. Finally, we give some reasons why cryptography is often misused in web technologies, and recommend steps to avoid these mistakes.
Lần này thay đổi không khí, nộp paper cho một hội thảo hàn lâm, may mắn là không những họ không kỳ thị mà còn ủng hộ, giúp đỡ chỉnh sửa và làm cho paper tốt lên rất nhiều. Tôi đang chỉnh sửa lại vài chỗ trong paper trước khi gửi lên e-print. Bạn nào quan tâm thì có thể quay lại đây vài ngày tới, tôi sẽ gửi đường dẫn đầy đủ đến paper lên đây.

Paper này đánh dấu chặng đường hai năm của dự án nghiên cứu cách thức các kỹ thuật cryptography được sử dụng (sai) trong môi trường phát triển web. Đây là hướng nghiên cứu mà có lẽ tôi sẽ vẫn theo đuổi trong thời gian tới. Hai năm trước cá nhân tôi còn rất mù mờ về cryptography nói chung và sử dụng cryptography nói riêng. Những điều tôi biết chủ yếu gói gọn trong cuốn sách "Practical Cryptography" http://www.schneier.com/book-practical.html) của Niels Ferguson và Bruce Schneier. Thật tế là hầu hết các tấn công mà bọn tôi sử dụng trong các nghiên cứu vừa qua đều được đề cập đến trong cuốn PC. Dẫu vậy tôi rút ra được một bài học quan trọng trong quá trình làm nghiên cứu đó là luôn đặt câu hỏi tại sao, không bao giờ dễ dàng chấp nhận sự thật mà sách vở tài liệu liệt kê ra. Đằng sau mỗi câu hỏi rất có thể là một hướng nghiên cứu mới.

Ví dụ như sách có nói về length-extension attack trong các hàm hash theo mô hình Merkle-Damgard nhưng không nói cụ thể về cách thức triển khai tấn công. Bọn tôi tò mò, tìm hiểu cách triển khai tấn công này (cũng như tìm hiểu cấu trúc của MD5 và SHA1), và "tình cờ" phát hiện ra có thể sử dụng phương thức này để tấn công bộ API của Flickr. Hoặc như sách nói nếu xử lý padding không đúng, có thể khiến cho hệ thống bị tấn công theo phương thức "chosen-ciphertext attack" nhưng cũng không nói cụ thể thế nào, mà chỉ trích dẫn một paper khác.

Một nghiên cứu khác mà bọn tôi đang theo đuổi cũng là ở dạng người ta cho rằng là không thể làm được, nhưng rốt cuộc khi tìm hiểu sâu hơn thì  bọn tôi mới nhận ra rằng thật ra không những có thể triển khai tấn công mà còn rất nhanh và đơn giản.

Cryptography không phải là một giải pháp trọn vẹn cho vấn đề security, nhưng mà cryptography là một phần của tất cả các giải pháp cho các vấn đề security. Dẫu vậy, sử dụng cryptography đúng cách là không dễ và hiện giờ lập trình viên cũng không được hỗ trợ như đối với các vấn đề liên quan đến memory corruption. Số lỗ hổng cryptography là rất nhiều và hầu hết là nghiêm trọng. Thật tế nhắm mắt tìm trên Google các đoạn mã cryptography, thì cá nhân tôi thấy phần lớn trong số đó là không an toàn.

Theo quan sát của tôi thì hiện giờ trong cộng đồng security ở VN cũng như nước ngoài, có rất ít người tập trung vào đề tài đánh giá việc sử dụng cryptography đúng cách trong các phần mềm thương mại. Đây là một cơ hội cho bạn nào muốn làm nghiên cứu trong mảng đề tài an ninh ứng dụng. Ngoài an ninh ứng dụng ra, thì có thể kết hợp cryptography và hardware reverse engineering để nghiên cứu cách cryptography được sử dụng trong các thiết bị điện tử cá nhân như đầu đọc sách, đồ chơi, điện thoại hoặc các loại smartcard như thẻ thanh toán. Đây cũng là lĩnh vực còn ít người làm và còn nhiều cái để làm.

Tuesday, May 17, 2011

Xấu hổ và tự hào

Nhân dịp hôm nay đọc được một loạt bài về "yêu nước, tự hào dân tộc" trên VietnamNet, tôi xin kể cho các bạn nghe một câu chuyện nhỏ.

Chỗ tôi ở có nhiều người Ấn Độ. Tôi cũng có một thằng bạn người Ấn Độ. Một hôm hai đứa đang xếp hàng chờ mua đồ ăn trưa thì có một người, qua diện mạo tôi đoán cũng là người Ấn Độ, chen ngang hàng, giành mua trước.

Lúc quay lại bàn ăn, tôi có hỏi thằng bạn là mày thấy thế nào khi tự dưng có thằng người Ấn Độ làm chuyện khó coi trước mặt mày và bạn mày. Bạn tôi kêu, ơ mày hỏi gì lạ, tao không thấy gì cả, nó là người Ấn Độ, tao là người Ấn Độ, nhưng không có nghĩa là tao có trách nhiệm hay là bắt buộc phải xấu hổ về chuyện nó làm. Ai làm nấy chịu, tao chỉ xấu hổ nếu tao làm sai.

Hết chuyện rồi ;-).

Bây giờ bạn thử đổi "Ấn Độ" bằng "Việt Nam" và thử tự hỏi, có nên thấy xấu hổ nếu một chuyện tương tự xảy ra? Chưa hết, bây giờ bạn thử đổi "xấu hổ" bằng "tự hào" và thay vì có người chen ngang hàng, thì có một người Việt Nam tự nguyện nhường chỗ, rồi đọc lại và thử tự hỏi, có nên thấy tự hào?

Sau khi trả lời xong rồi, bạn thử đọc lại câu chuyện, lần này bỏ luôn yếu tố có anh bạn nước ngoài, mà hãy thử tưởng tượng là tất cả diễn ra ở Việt Nam, xung quanh toàn người Việt Nam. Bạn có còn cảm thấy xấu hổ hay tự hào khi một người Việt Nam chen ngang hàng và một người khác nhường chỗ cho bạn?

Nếu mà rảnh như tôi hôm nay, thì bạn hãy thử hỏi: Tại sao chúng ta có quyền tự hào về những điều tốt đẹp liên quan đến Việt Nam? Tại sao chúng ta phải có trách nhiệm xấu hổ về những điều xấu xa liên quan đến Việt Nam?

Nếu mà mấy câu hỏi đó chưa ép phê, thì bạn hãy thử thay Việt Nam bằng một danh định nào đó của bạn. Ví dụ như nếu bạn là một kỹ sư máy tính, thì thay bằng kỹ sư máy tính, nếu bạn theo đạo Phật thì thay bằng đạo Phật, nếu bạn là đàn ông thì thay bằng đàn ông...

-----

Coi báo đài, tôi thấy những người vừa có thành tích này nọ thường được hỏi một câu thế này: anh/chị có thấy tự hào khi là người Việt Nam [đầu tiên] làm được X? Nếu tôi không lầm thì câu hỏi này hàm ý "là người Việt Nam" sẽ khiến cho việc "làm được X" đáng để tự hào thêm một tẹo. Mà nhiều khi thấy tự hào thêm thật chứ.

Ví dụ như hồi trước có lần tôi đi hội nghị X, làm được việc Y, tôi cũng nghĩ, "ôi trời ơi, tự hào quá, ở nhà có ai làm được như ta". Xong rồi nhìn lại việc Y đã làm, tôi tìm mãi mà không thấy giá trị thật sự, đóng góp trí tuệ của chúng tăng lên được chút nào. Một tẹo cũng không. Ơ hay, nhưng tôi vẫn tự hào vì không có ai làm được như tôi! Thế rồi nhìn quanh cái hội nghị X, tôi thấy ở đấy có một đám đã làm Y và còn hơn thế nữa từ đời tám hoánh rồi. Nhưng mà chúng nó không phải là người Việt Nam! Lại quay lại chỗ giá trị thực sự của Y...

----

Rốt cuộc rồi khi nào thì chúng ta có quyền tự hào? Khi nào thì chúng ta phải có trách nhiệm xấu hổ? Tôi nghĩ trả lời hai câu hỏi đơn giản này cũng là một cách để bớt "chấp" vào những danh định.

Siêu hacker

1. MPlayer, Google Chrome, VLC, MythTV... có chung điểm gì? Chúng đều xài thư viện FFmpeg. Rất nhiều phần mềm khác sử dụng thư viện này và có thể cái tivi hay chiếc điện thoại của bạn cũng sử dụng FFmpeg.

2. Xen, VirtualBox, Linux Kernel-based Virtual Machine... có chung điểm gì? Chúng đều dùng công nghệ của QEmu. Xen nghe có vẻ xa lạ? Amazon EC2, và có thể công nghệ điện toán đám mây mà bạn đang dùng, sử dụng Xen.

3. IOCCC, ra đời năm 1984, là một cuộc thi quốc tế để chọn ra đoạn mã C rối rắm sáng tạo nhất. Đúng như tên gọi, các đoạn mã chiến thắng IOCCC thường rối rắm nhưng lại cực kỳ sáng tạo và đương nhiên phải hữu ích.

Đơn cử như năm 2000, người chiến thắng viết một chương trình có kích thước 475 byte, in ra giá trị của 2^6972593 - 1, số nguyên tố lớn nhất từng được biết đến tại thời điểm đó, trong vài phút. Đừng thử ở nhà: viết chương trình tính số đó, xem coi mất bao lâu.

Đơn cử như năm 2001, người chiến thắng viết một trình biên dịch có thể tự biên dịch chính nó, có thể biên dịch và chạy mã nguồn C mà không cần phải có một chương trình hỗ trợ nào khác. Kích thước trình biên dịch này lên đến...2048 byte.

4. Tính các chữ số thập phân của số Pi là một thú vui của nhiều người từ vài ngàn năm nay. Cho đến năm 1995, thuật toán tốt nhất để tính chữ số thứ n trong hệ nhị phân của Pi mất thời gian O(n^3log(n)^3). Năm 1997, một thuật toán mới được công bố với thời gian tính toán chỉ mất O(n^2), nghĩa là tốt hơn thuật toán cũ 43%.

Năm 2009, thuật toán này cho đến nay vẫn được xem là thuật toán tốt nhất cho bài toán này và nó đã được dùng để tính chữ số thập phân thứ 2.7 ngàn tỉ của Pi, giữ kỷ lục thế giới vào thời điểm đó. Điều đáng nói là toàn bộ quá trình tính toán được thực hiện bằng một máy tính để bàn có giá 3.000 USD, trong khi kỷ lục cũ được thực hiện bằng một siêu máy tính gồm 640 node, mỗi node có tốc độ tính toán 147.2 gigaflops với tổng bộ nhớ là 13.5 terabyte.

5. Cách đây vài ngày trên Internet xuất hiện một đoạn chương trình cho phép bạn khởi động và chạy phiên bản mới nhất của nhân Linux ngay trên trình duyệt. Có đủ trọn bộ busybox, vi, emacs và cả một trình biên dịch. Chỉ thiếu mỗi...Firefox nữa thôi là bạn có thể chạy Firefox trong Linux trong Firefox trong Linux. Àh tôi quên nói là chương trình này, do chạy trên trình duyệt, được viết toàn bộ bằng...Javascript.

----

1, 2, 3, 4, 5 có điểm gì chung? Chúng đều là thành quả của một người. Fabrice Bellard.