Featured Post

Có một Biển Đông trên không gian mạng

Có một Biển Đông trên không gian mạng Thái Dương Mùa hè 2014, giữa lúc người Việt trong nước và hải ngoại đang sôi sục vì Trung Quốc đư...

Wednesday, October 30, 2013

GDayX Vietnam 2013

Sáng thứ bảy tuần này tôi sẽ nói chuyện ở hội thảo GDayX Vietnam 2013. Phần đầu tôi sẽ nói về một vài dự án thú vị mà tôi đã và đang làm, qua đó "bật mí" phần nào công việc của một lập trình sư ở Google. Phần sau, theo gợi ý của một người bạn, tôi sẽ chia sẻ hành trình "Từ Quận Tư đến Google", hi vọng là sẽ cung cấp được nhiều thông tin và kinh nghiệm cho những ai muốn đi ra thế giới.

Hội thảo sẽ được tổ chức vào sáng thứ bảy tuần này, tại công viên phần mềm Quang Trung. Hình như người ta có làm live stream trên YouTube. Mời mọi người đến dự nhé.

Sunday, October 20, 2013

A quick audit of CryptoCat's elliptic curve crypto

A few days ago I saw CryptoCat was featured on the New York Times. That reminded me of a quick audit of the chat software that I did several weeks ago. I thought I'd share my notes, since I have no plan in continuing the audit. Hopefully somebody would pick up what I found, and do something useful with them. Note that I just read the code and take notes, but haven't actually verified if the bugs work or their impacts. A copy of this blog post has been sent to CryptoCat.

First off, CryptoCat's engineering practices look bad to me. It seems that the CryptoCat team just throws together things until it works then move on [1]. They have, let me count, exactly 4 tests for the whole program. They mix Curve25519 with P-256, e.g., they call a function Curve25519.ecdsaVerify, but it actually implements (insecurely) ECDSA's signature verification over P-256. Last but not least although I like reading crypto code theirs is so clumsy that I gave up after a few minutes.

The fact that Javascript rarely complains about typing or out-of-bound access issues makes it both hard and interesting to write secure crypto code in this language. The only ways I know to catch these bugs are: writing more tests, using pseudo typing system provided by Javascript compilers such as Google Closure, and using a single data type such as Uint8Array for all inputs and outputs. Failure to do any of these will result in serious bugs. I've seen a Javascript implementation of AES that leaks secret keys because it forgets to check that some input is indeed an array of bytes. CryptoCat doesn't do any of these, which made me very doubtful of its crypto. So I took a look, and here's a few problems that I found in CryptoCat's elliptic curve crypto library [2]:

1/ Curve25519.ecdsaGenPrivateKey (line 187) generates private keys that aren't in the correct range. I don't think this is a vulnerability, but it's still a mistake that should be avoided.

2/ Curve25519.ecdsaSign calculates the hash of the to-be-signed message as follows (line 347):

m = BigInt.mod(CryptoJS.SHA512(JSON.stringify(message)).toString(CryptoJS.enc.Hex).substring(0,32), n256)

I could see there are two "type confusion" bugs here:

2.1/ A 512-bit hash is converted to hex of which a substring of 32 byte is returned. That means the hash is reduced to only 128-bit. Thus, the security level of this implementation of ECDSA would be only 64-bit.

2.2/ A string is used as a BigInt. I haven't reviewed BigInt so I don't know how large the impact could be. If there's a way to make m equal to zero bug #3 would be exploitable.

A few days after I looked at this function somebody reported a vulnerability in it [3]. It seemed that CryptoCat's lead developer didn't know what this function does - he had to consult an anonymous cryptographer that contributed this code. He decided to comment out the function, and added a warning, which is amusing because it's mostly fine, as there's no modular reduction in the way it generates the nonces (line 352). The nonces may not be in the correct range, but that's a non-security issue. which is cool. Although it isn't apparent, the nonce will always be modular reduced by the order of the group so they'll be biased.

3/ Curve25519.ecdsaVerify incorrectly verifies the signature: a pair of (n256, n256) or negative numbers would pass all the range checks (line 394). This is bad, and it's only sheer luck that makes the bug seem unexploitable. The call to BigInt.inverseMod (line 398) returns null if s is divisible by n256. That makes the next line throw an exception. Otherwise (n256, n256) would have been accepted as a valid signature for all messages.

Update: CryptoCat's response.

[1] I'm quoting Rasmus Lerdorf, the creator of PHP. The full quotation is: "I'm not a real programmer. I throw together things until it works then I move on. The real programmers will say "Yeah it works but you're leaking memory everywhere. Perhaps we should fix that." I’ll just restart Apache every 10 requests.".

[2] I chose this library because I've worked on ECC recently. Originally I wanted to look at the BigInt library, but it seems that CryptoCat just copies it from somewhere else.

[3] If you implement DSA/ECDSA be aware of this attack. Bleichenbacher once said that he only needed a fraction of a bit of each nonce to calculate the private key, given enough signatures.

Friday, October 18, 2013

Cứu trợ trực tiếp


Clip này quay lại chuyến đi khánh thành cầu và phát quà cho người dân của đoàn từ thiện do mẹ tôi tổ chức. Phút thứ 40 là quay cây cầu mới và phát quà, phút thứ 56' là đi khảo sát những nơi cần xây cầu. Những chuyến đi trước mẹ tôi không có quay phim, do sợ tốn tiền, nhưng mà chuyến này quay lại để dễ quyên góp.

Đợt này bão ở Quãng Bình, mẹ tôi cũng sẽ tổ chức một chuyến đi trực tiếp ra đó cứu trợ. Dự kiến là giữa tháng 11 sẽ đi, tùy vào tình hình quyên góp nhanh hay chậm. Đoàn dự kiến sẽ liên hệ với hội Chữ Thập Đỏ, tìm hiểu xem vùng nào bị nặng nề nhất, rồi ra tận nơi, phát 500 phần quà cho người dân ở đó.

Tôi có đi theo đoàn này một hai lần thì thấy cách làm của đoàn rất trực tiếp: họ kêu gọi quyên góp tiền và hàng, rồi sau đó đóng lại thành từng phần. Có khi ra đến gần nơi bão lụt mới mua hàng để đóng, nhưng cũng có khi đóng trực tiếp từ khi còn ở Sài Gòn. Mỗi gói hàng có thể gồm những vật dụng như là áo mưa, mền, dầu cù là, quần áo, mì gói, gạo và tiền mặt, v.v. tuỳ theo người ta cho gì và đóng góp của những người trong đoàn như thế nào.

Thường đoàn sẽ liên hệ với chính quyền địa phương để tập hợp người dân lại một chỗ, rồi phát hàng trực tiếp cho từng người. Có những năm ngập lụt dữ quá thì đoàn thuê thuyền, đi thẳng vào vùng lũ luôn, rồi quăng hàng xuống, cho dân họ vớt lên.

Hôm qua mẹ tôi có nhờ tôi hỏi xem có người quen nào của tôi muốn đóng góp hay không. Nếu có bạn nào muốn đóng góp thì có thể làm như sau:

Nếu ở Việt Nam, chuyển tiền vào tài khoản sau và nhớ ghi là "Cứu trợ Quãng Bình".

Vietcombank 0331000422125
Chủ tài khoản: Nguyễn Bảo Huy

Nếu ở nước ngoài thì vui lòng để lại tin nhắn ở đây hoặc gửi email cho tôi ở địa chỉ thaidn@gmail.com. Tôi đang tìm cách chuyển tiền tiện lợi nhất và sẽ thông báo sau.

Ngoài những chuyến cứu trợ đột xuất này ra thì mẹ tôi còn tổ chức những hoạt động định kỳ:

a) nấu cơm chay cho người nghèo, trẻ em mồ côi, người già và những người ở trại tâm thần. Mẹ tôi có nói mỗi lần nấu là cho khoảng 2000 người ăn, chi phí khoảng tầm 10 triệu đồng. Mỗi tháng bà ráng nấu một lần, nhưng hễ cứ quyên góp được đủ tiền là đi nấu thôi.

b) xây cầu ở vùng xâu vùng xa. Mẹ tôi nói có một đoàn khác chuyên đi xây cầu, nên bà cũng "hùn vốn" với họ. Vừa rồi đã xây được một cây cầu (xem clip ở trên). Mỗi cây cầu như thế tốn khá nhiều tiền, hiện giờ chủ yếu quyên góp từ lòng hảo tâm của bà con tiểu thương Chợ Lớn.

c) mỗi năm định kỳ đoàn có đi lên Tây Nguyên phát quà cho những nhóm dân thiểu số ở đó.

Nếu có anh chị nào muốn đóng góp cho những hoạt động này thì cũng chuyển vào tài khoản ở trên, nhưng ghi là "Ủng hộ xây cầu" hoặc "Ủng hộ nấu cơm chay miễn phí".

Thursday, October 10, 2013

Tuesday, October 8, 2013

Sống vui

Hôm nay đài NPR có phiên phỏng vấn Elizabeth Smart, cô gái bị bắt cóc trong suốt 9 tháng hồi mùa hè năm 2002. Kẻ bắt cóc hãm hiếp Smart hầu như mỗi ngày, còn vợ của hắn thì đối xử với cô ấy như nô lệ. Lúc đó Smart mới có 14 tuổi.

Bây giờ Smart đã lập gia đình, sắp tốt nghiệp đại học, đang là chủ tịch của một quỹ bảo vệ trẻ em và chuẩn bị xuất bản một cuốn sách kể về 9 tháng trong địa ngục đó. Khi được hỏi điều gì đã giúp Smart có thể sống một cuộc đời hạnh phúc và có ích cho xã hội sau biến cố khủng khiếp đó, Smart nhắc lại lời khuyên của mẹ cô ấy:

The morning after I was rescued my mom gave me the best advice I've ever been given. My mom said to me, "Elizabeth, what this man has done to you, it's terrible, there aren't words strong enough to describe how wicked and evil he is. He has stolen nine months of your life from you that you will never get back. But the best punishment you could ever give him is to be happy, is to move forward with your life and to do exactly what you want to do. The best thing you can do is move forward because by feeling sorry for yourself and holding on to what's happened, that's only allowing him more power and more control over your life, and he doesn't deserve another second. So be happy."

Một cách sống thật tích cực :-).

Tự dưng tôi nhớ đến một câu nói vui: dẫu hôm nay có chuyện gì xảy ra đi chăng nữa thì cũng không sao cả vì bây giờ đã là ngày mai ở New Zealand rồi :-P.

Friday, October 4, 2013

Duty Calls


Từ http://xkcd.com/386/. Dành tặng tất cả chúng ta ha ha ha.

PS: Ôi trời ơi bây giờ mới biết Randall còn rất trẻ, bằng tuổi tôi thôi!

Thursday, October 3, 2013

Suy nghĩ

Có bạn còm trong bài trước là "treo đầu dê bán thịt chó" là vi phạm pháp luật và phải bị xử lý. Tôi không rõ mức vi phạm khi bán hàng kém chất lượng là như thế nào và sẽ bị xử phạt ra sao, dẫu vậy tôi đồng ý với ý kiến này.

Nhưng tư tưởng không phải là đầu dê mà cũng chẳng phải là thịt chó!

Kiểm định bất kỳ loại hàng hóa nào, hàng tiêu dùng hay thực phẩm, cũng cần kiến thức, kinh nghiệm và những công cụ rất cụ thể. Hầu hết chúng ta đều phải giao lại việc đó cho những người có chuyên môn, với niềm tin rằng họ sẽ không để chúng ta ăn phải chất độc, mua phải hàng dỏm, v.v.

Thật tế thì không riêng gì hàng hóa, cuộc sống hiện đại khiến mỗi chúng ta đặt rất nhiều niềm tin, thường xuyên giao cả mạng sống của mình vào tay những người lạ. Ví dụ như bạn đi máy bay, dẫu muốn hay không thì bạn cũng phải tin vào khả năng của cơ trưởng và phải tin là đã có những người có trách nhiệm kiểm định khả năng của bác ấy.

Nhưng có một việc mà bạn không thể tin, không thể giao cho bất kỳ ai khác: suy nghĩ...

Tôi có một thằng bạn thân. Mỗi lần nó kêu ai làm cái gì đó mà không được thì nó hay chửi: đứa nào không X là con chó! Trong đó X có thể là đi câu cá, uống bia, chơi điện tử, v.v. Có một lần nó chửi một câu làm tôi thấy rất khoái (mặc dù nó chửi tôi): đứa nào không suy nghĩ là con chó!

Muốn tồn tại và có sức khỏe thì phải ăn và vận động. Muốn sống như một con người tự do, chứ không phải như con chó chủ kêu gì thì làm đó, thì phải suy nghĩ. Einstein cũng nói rằng dạy cách suy nghĩ độc lập là mục tiêu quan trọng nhất của giáo dục. Vậy phải suy nghĩ thế nào? Đây là một câu hỏi rất đáng để... suy nghĩ, mà tôi sẽ quay lại trong dịp khác.

Quay lại chuyện kiểm duyệt. Tôi dùng từ kiểm duyệt (censorship) chứ không phải kiểm định (testing) như ở trên. Trong tiếng Việt hai từ này có thể dùng thay thế cho nhau, nhưng trong tiếng Anh thì tôi chưa thấy ai dùng từ censorship để nói về chuyện kiểm tra chất lượng sản phẩm cả. Sự khác nhau này gợi ý rằng có lẽ đem chuyện kiểm định hàng hóa để so sánh với kiểm duyệt tư tưởng là một việc rất thiếu... suy nghĩ.

Nếu bạn cho rằng tư tưởng cũng giống như hàng hóa bình thường thôi, thì hãy tự hỏi tại sao đảng cầm quyền lại có hẳn một ban gọi là Ban Tư Tưởng Văn Hóa, sao họ không gọp chung lại thành Ban Tư Tưởng Văn Hóa và Thịt Chó. Đôi khi nhìn vào việc người ta làm sẽ giúp bạn hiểu được cái gì làm cho họ sợ hãi. Mà họ sợ cũng phải thôi. Lời nói có sức mạnh có thể làm thay đổi trời đất. Một cuốn sách có thể là nguồn cơ của nhiều cuộc cách mạng. Nguyễn Ái Quốc đọc sách của Lenin rồi làm cách mạng ở Việt Nam, sử sách còn ghi.

Nhưng sách nói sai sự thật và có những tư tưởng rất xấu! Đó là bạn nghĩ như thế. Thử tưởng tượng một ai đó đọc sách của Lenin, kết luận rằng sách này rất xấu và tiêu hủy hết thì cụ Hồ lấy sách ở đâu mà đọc, lấy tư tưởng ở đâu mà làm cách mạng?

Bạn cũng đã nói những gì cần phải nói. Bây giờ là lúc im lặng, cho người khác một cơ hội đọc, nghĩ và tự rút ra kết luật của họ. Bởi vì tất cả chúng ta đều là con người, không cần và không thể để người khác nghĩ giùm.