|
|
0. Tôi mới từ Việt Nam chuyển sang sống và làm việc ở Silicon Valley gần một năm nay. Bây giờ tôi đang làm việc ở Google. Hôm nay tôi muốn chia sẻ một số kinh nghiệm tìm việc làm ở Silicon Valley (SV) [1].
Đa số những người Việt đang sống và làm việc ở SV mà tôi có dịp gặp đều là du học sinh, học đại học hoặc là nghiên cứu sinh tiến sĩ ở các trường đại học của Mỹ hoặc các nước, rồi chọn SV để làm việc và định cư lâu dài. Nhiều anh chị ngạc nhiên khi biết tôi không phải là du học sinh. Thú thật là tôi cũng ngạc nhiên, khi thấy có rất ít người từ VN qua đây như tôi. Tôi tin là nhiều kỹ sư ở VN đủ khả năng và có mong muốn tìm được một việc làm ở SV. Nhưng có lẽ ít người có thông tin về các việc làm ở SV cũng như đường đi nước bước. Tôi cũng đang hỗ trợ một vài người bạn tìm việc, nên sẵn tiện viết lại đây một số suy nghĩ.
--
1. Đầu tiên bạn phải tự tin bạn đủ khả năng làm việc ở SV. Trước khi vào Google, tôi làm việc ở một công ty tư vấn nên tôi có dịp gặp gỡ, làm việc với khá nhiều kỹ sư của các hãng phần mềm lớn. Tôi nghĩ phần lớn trong số đó, nhất là những kỹ sư Ấn Độ và Trung Quốc, không giỏi hơn những kỹ sư ở VN mà tôi đã làm việc hoặc học chung trước đây. Hồi tôi mới nhận được email từ Google, tôi cũng nghĩ tôi không đủ tiêu chuẩn và nhận lời phỏng vấn chỉ vì tò mò. Rồi tôi thấy hóa ra phỏng vấn ở Google không quá khó như tôi đã nghĩ. Tất cả các câu hỏi đều xoay quanh những việc tôi đã làm hàng ngày trong nhiều năm. Nói cách khác, nếu bạn làm việc chăm chỉ và kỷ luật, bạn có thể tìm được một công việc tốt ở bất kỳ công ty nào trên thế giới.
Vùng SV thu hút tài năng từ khắp nơi trên thế giới. Các công ty lớn như Google mỗi năm nhận được vài triệu hồ sơ ứng viên. Dẫu vậy hầu hết các công ty đều luôn ở trong tình trạng cần người và lúc nào cũng có vị trí trống. Do đó nếu có một chiến lược tìm việc hiệu quả, bạn sẽ có một việc làm tốt. Đây cũng là ý tiếp theo mà tôi muốn chia sẻ.
--
2. Tôi thấy chiến lược hiệu quả nhất để tìm việc có thể gói gọn trong câu thành ngữ: nhất cự ly, nhì tốc độ. Công ty thường tuyển người thông qua giới thiệu nội bộ và ưu tiên phỏng vấn các ứng viên do nhân viên cử tuyển. Ví dụ như khi cần tìm người Việt phụ trách thị trường VN, nơi đầu tiên mà công ty tìm kiếm ứng viên chính là đội ngũ nhân viên người Việt của họ. Vì vậy bạn cần phải tiếp cận với công ty từ nhiều hướng, càng gần càng tốt, càng nhanh càng tốt. Ví dụ như:
* Tiếp cận với HR thông qua các mạng xã hội như LinkedIn. Với một hồ sơ LinkedIn "bắt mắt", bạn có thể sẽ nhận được nhiều lời mời hấp dẫn. Tôi nhận được email đầu tiên của Google là qua LinkedIn.
* Tiếp cận với nhân viên hiện tại thông qua các dự án nguồn mở của công ty. Cơ hội được tuyển dụng của bạn sẽ tăng lên 2000% nếu như bạn được một nhân viên của công ty cử tuyển. Rất nhiều công ty có các dự án nguồn mở và sẽ rất khó để họ làm ngơ bạn một khi bạn có những đóng góp đáng kể vào các dự án đó.
* Tiếp cận với nhóm người Việt đang làm việc ở công ty đó. Tương tự như ý vừa rồi, đây cũng là một cách để hồ sơ của bạn được gửi trực tiếp đến những nơi cần đến mà không phải qua vòng sơ loại.
* Tham gia các cuộc thi và sự kiện do công ty tổ chức. Các công ty tổ chức thi thố cũng là để tìm kiếm tài năng, nên mỗi cuộc thi là một cơ hội cho bạn thể hiện với nhà tuyển dụng.
* Tiếp cận công nghệ bằng cách trở thành chuyên gia của một lĩnh vực mà công ty rất cần. Đây là cách tiếp cận khó nhất nhưng cũng là cách hiệu quả nhất.
* Tiếp cận địa lý bằng cách chuyển đến SV hoặc các khu vực khác ở Mỹ. Tôi thấy các công ty thường ưu tiên các ứng viên đang ở SV (vì chi phí tuyển dụng sẽ rẻ hơn), nên nếu bạn có cơ hội, bạn hãy chuyển đến SV.
* Tiếp cận với các công ty gia công có trụ sở tại VN. Tôi có hai người bạn trước đây được TMA gửi sang SV làm gia công cho một số hãng, rồi nhân cơ hội đó tìm việc làm và ở lại SV làm việc lâu dài luôn.
* Nếu bạn là sinh viên thì hãy ứng tuyển làm thực tập sinh. Điều kiện tuyển thực tập sinh thường dễ hơn nhân viên chính thức nên cơ hội của bạn sẽ cao hơn. Làm thực tập sinh cũng là con đường ngắn nhất để trở thành nhân viên chính thức.
--
3. Hai phần tôi vừa đưa ra là những ý quan trọng nhất quyết định phần lớn sự thành bại trong quá trình tìm việc của bạn. Phần tiếp theo tôi sẽ bàn sơ qua về việc thực hiện những ý này như thế nào.
Chuẩn bị
Bạn hãy tự hỏi thế này: bạn sẽ làm gì để chuẩn bị cho buổi phỏng vấn của bạn ở Facebook? Tôi nghĩ danh sách sẽ dài và rất may là bạn còn nhiều thời gian. Dẫu vậy, đừng chần chờ, mà hãy bắt tay vào ngay hôm nay. Bạn không thể biết cơ hội sẽ đến lúc nào, nên cách tốt nhất là phải chuẩn bị tốt.
Rõ ràng bạn cần phải chuẩn bị là tiếng Anh. Nếu bạn không thể sử dụng thành thạo tiếng Anh thì hãy dừng lại hết mọi việc để tập trung học tiếng Anh, cho đến khi nào bạn có thể giao tiếp bằng tiếng Anh qua điện thoại.
Chuẩn bị về nghề nghiệp chuyên môn thì phụ thuộc vào công việc mà bạn muốn làm. Đa số công việc ở SV là kỹ sư phần mềm. Với vị trí này, bạn có thể tham khao bài viết của Steve Yegge [2] để biết nên có những kiến thức nào. Tôi sẽ viết một bài dành riêng cho những bạn muốn làm kỹ sư an ninh ứng dụng.
Ngoài ra, bạn nên tìm đọc những cuốn sách cần đọc khi học khoa học máy tính [3] và theo học các lớp học miễn phí [4] của các đại học lớn như Stanford và MIT. Nếu bạn đạt được kết quả tốt trong các môn học này thì đó sẽ là một điểm rất sáng trong hồ sơ của bạn.
Giỏi tiếng Anh và giỏi chuyên môn sẽ giúp bạn thực hiện những chiến thuật tiếp cận mà tôi liệt kê ở trên. Tiếp cận càng gần và càng nhanh thì bạn sẽ càng có nhiều cơ hội. Để nắm bắt các cơ hội thì bạn cần phải có một hồ sơ cá nhân "đẹp" và kỹ năng phỏng vấn tốt.
Làm hồ sơ cá nhân (resumè)
Bạn cần hai hồ sơ khác nhau. Một hồ sơ trên LinkedIn để thu hút các cơ hội nghề nghiệp từ HR và những nguồn khác. Hồ sơ thứ hai là hồ sơ mà bạn gửi cho những nhà tuyển dụng khi họ yêu cầu.
Với hồ sơ LinkedIn, bạn nên tập trung vào các mảng kỹ năng chuyên môn, trình độ học vấn và các giải thưởng nếu có. Sự thật là những tay "săn đầu người" thường đánh giá ứng viên thông qua các từ khóa , nên đây là nơi mà bạn càng có nhiều từ khóa nổi bật càng tốt. Đó là lý do tôi khuyên bạn nên tìm học các lớp học miễn phí của Stanford, bởi nếu bạn đạt được điểm tốt, thì bạn có thể có được từ khóa Stanford rất nặng ký trong hồ sơ của bạn.
Với hồ sơ mà bạn gửi cho nhà tuyển dụng, bạn phải khiêm tốn. Càng khiêm tốn càng tốt. Với người có ít hơn 10 năm kinh nghiệm làm việc, tôi nghĩ 1 trang A4 là đủ. Hồ sơ nên làm bằng LaTex, xuất ra tệp PDF với các đề mục chính như thông tin liên lạc, học vấn, kinh nghiệm làm việc, kỹ năng chuyên môn và giải thưởng nếu có. Nếu bạn có làm phần mềm hoặc có làm nghiên cứu thì có thể liệt kê những công trình nổi bật nhất.
Bạn cần phải cẩn trọng khi liệt kê các kỹ năng của bạn, bởi người phỏng vấn sẽ dựa vào đó mà đặt câu hỏi. Chỉ liệt kê những gì mà bạn thật sự "rành sáu câu". Tuyệt đối không liệt kê những mảng công việc mà bạn chỉ làm qua loa hoặc đã làm quá lâu nên bây giờ bạn không còn nhớ. Tuyệt đối không liệt kê quá nhiều từ khóa cùng một lúc, nếu không thì chính bạn sẽ là nạn nhân. Bạn nên hiểu rằng người phỏng vấn bạn rất có thể là những người tiên phong và là chuyên gia hàng đầu về các kỹ năng mà bạn ghi trong hồ sơ.
Sau khi làm hồ sơ, bạn nên gửi cho bạn bè hoặc đồng nghiệp đánh giá và phê bình. Bạn cũng có thể gửi cho tôi nếu bạn muốn.
Phỏng vấn
Một cách chuẩn bị cho buổi phỏng vấn là thử sức với các câu hỏi phỏng vấn trên mạng. Tôi nghĩ có hẳn vài cuốn sách viết về các câu hỏi này. Blog KHMT cũng có một bộ câu hỏi phỏng vấn rất thú vị [5]. Tôi chưa từng gặp các câu hỏi kiểu như "Làm sao để dời một ngọn núi?", nên tôi nghĩ bạn cũng không cần phải bỏ nhiều thời gian cho dạng câu hỏi đó.
Bạn cũng nên thử phỏng vấn với bạn bè và đồng nghiệp. Nếu có cơ hội, thử phỏng vấn với các công ty khác nhau, bất kể bạn có muốn làm việc cho họ hay không. Việc phỏng vấn sẽ giúp bạn nhận ra những điểm yếu trong kiến thức cũng như kỹ năng phỏng vấn, để có thể khắc phục kịp thời trước khi phỏng vấn với công ty mà bạn yêu thích.
Thông thường thì bạn sẽ được phỏng vấn qua điện thoại trước. Cuộc phỏng vấn ngắn đầu tiên là của HR, sau đó sẽ có trung bình 2 cuộc phỏng vấn kỹ thuật khác. Bạn nên sử dụng điện thoại bàn có loa lớn, không nên trả lời phỏng vấn qua điện thoại di động. Nếu được thì yêu cầu họ phỏng vấn qua Skype hoặc Google+ Hangout, để lỡ như bạn không nghe kịp, thì bạn có thể hỏi họ lại qua cửa sổ chat . Trước khi trả lời, bạn nên nhắc lại câu hỏi và cũng đừng ngại hỏi lại câu hỏi nếu bạn không nghe kịp hoặc không hiểu.
Nếu vượt qua được các cuộc phỏng vấn qua điện thoại (chúc mừng!), bạn sẽ được mời đến trụ sở của công ty để phỏng vấn. Thông thường bạn sẽ phỏng vấn liên tục với nhiều người trong một ngày. Như tôi đã nói ở trên, thực tế các buổi phỏng vấn không khó. Các câu hỏi chỉ xoay quanh những kỹ năng mà bạn liệt kê trong hồ sơ, nên hãy an tâm nếu bạn đã có quá trình làm việc chăm chỉ. Chúc thành công!
Vượt qua được vòng phỏng vấn rồi thì 90% là bạn sẽ được tuyển dụng. Lúc này một bước quan trọng là thỏa thuận lương bổng, điều kiện làm việc.
Thỏa thuận lương bổng
Lưu ý là mọi thỏa thuận lương bổng ở SV đều là trước thuế và có rất nhiều loại thuế bạn phải đóng. Ví dụ tôi phải nộp gần 40% thu nhập cho thuế.
Hiện giờ thì mức thu nhập trung bình của kỹ sư phần mềm mới ra trường ở SV tôi nghĩ là ở mức 80.000 USD/năm. Mỗi năm kinh nghiệm bạn có thể tính thêm 10%. Trong quá trình đàm phán lương bổng, có thể HR sẽ hỏi mức lương ở công ty cũ của bạn. Bạn không phải và không nên trả lời câu hỏi này, bởi có thể HR đang tìm lý do để hạ lương bạn xuống .
Thường các công ty sẽ gửi cho bạn một thư đề nghị (offer letter), trong đó ngoài con số lương chính thức, còn có thể có:
* Số ngày nghỉ phép ăn lương. Thông thường là từ 10 ngày đến 15 ngày.
* Mức thưởng hàng năm. Đa số các công ty đều có quy định một mức cụ thể và bạn có thể được hơn nếu làm tốt.
* Cổ phần của công ty. Cái này thì có quá nhiều dạng nên tôi không bàn ở đây.
* Các loại bảo hiểm, bao gồm bảo hiểm sức khỏe, mắt, răng và bảo hiểm nhân thọ. Thông thường các công ty sẽ trả một phần và bạn sẽ trả một phần. Không có bảo hiểm thì khó mà sống sót được ở Mỹ, nên bạn phải coi kỹ các loại bảo hiểm mà công ty tài trợ.
* Tiền thưởng ký hợp đồng. Công ty sẽ gửi cho bạn một khoản "lót tay" nếu bạn đồng ý làm việc cho họ.
* Tiền chuyển địa điểm. Công ty sẽ tài trợ vé máy bay cũng như các khoản phí khác để bạn chuyển từ VN sang SV.
* Hưu trí và các lợi ích khác.
Đừng bao giờ vội vàng chấp nhận offer. Đây là một cuộc thương lượng và không có lý do gì bạn phải đồng ý với đề nghị đầu tiên của đối phương. Có những thứ mà bạn có thể thương lượng: tiền lương, cổ phần, tiền thưởng ký hợp đồng và tiền chuyển địa điểm. Rất có thể chỉ sau một vài email mà bạn sẽ có vài chục ngàn Mỹ kim .
Chúc may mắn!
-m
--
[1]: Về mặt địa lý thì các công ty công nghệ không còn chỉ tập trung ở khu vực Silicon Valley nữa, mà đã lan rộng ra khắp vùng vịnh San Francisco. Tôi gọi chung là Silicon Valley vì địa danh này quen thuộc với nhiều người.
[2]: http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
[3]: http://www.procul.org/blog/2007/10/01/sach-khmt/
[4]: http://openclassroom.stanford.edu/MainFolder/HomePage.php
[5]: http://www.procul.org/blog/selected_posts/
|
|
|
@chiro8x: về mặt thuật ngữ thì bạn bolzano_1989 nói đúng đó. trình biên dịch (compiler) là để chuyển từ một ngôn ngữ lập trình này sang một ngôn ngữ lập trình khác. ví dụ như gcc là chuyển từ C/C++ sang hợp ngữ (Assembly). trình hợp dịch (assembler) là chuyển từ hợp ngữ sang mã máy. hai công cụ này làm hai việc rất khác nhau, nên gọi chung là trình biên dịch là sai. mà bạn có để ý tên đầy đủ của NASM là Netwide Assembler?
để hiểu rõ thêm, bạn có thể tìm hiểu khi bạn gõ lệnh sau đây thì chuyện gì xảy ra:
Code:
-m
|
|
|
vd_ wrote:
@mrro
Xin ý kiến của mrro về nhận định ở trong blog post này http://vincent.bernat.im/en/blog/2011-ssl-dos-mitigation.html
Theo đó thì với tỷ lệ CPU giữa client : server thì việc client có thể làm tốn CPU của server khá nhiều. Như vậy thì chừng vài chục máy trạm là có thể làm quá tài server? DOS ở đây sẽ là DOS về CPU chứ không còn là network nữa.
tỉ lệ đó sẽ không quá lớn (65%, như trong bài mà bạn gửi) nếu bạn sử dụng các cipher như TLS_RSA_WITH_RC4_128_SHA, với chiều dài khoá RSA là 1024-bit. đây cũng là cipher mà các trang nhiều người truy cập sử dụng.
-m
|
|
|
mv1098 wrote:
mrro wrote:
MrKhoai wrote:
HTTPS không phải mặc định là tại vì thêm chữ "S". Một chữ thôi nhưng server và client phải làm việc nhiều lằm.
anh không nghĩ là server và client phải làm việc quá nhiều. nhiều site lơn trên thế giới bây giờ đã triển khai mặc định HTTPS cho nhiều dịch vụ lớn của họ. em xem thêm http://www.imperialviolet.org/2010/06/25/overclocking-ssl.html.
-m
Gần đây em đang bị 1 vấn đề về SSL trên website của mình
Nếu sử dụng các link internal mình có thể format thành "https" được. Nhưng nếu trong website có 1 link external format là "http" thì trình duyệt sẽ báo lỗi cert.
Ví dụ như Gmail cũng hay bị báo lỗi như thế này
Theo em nghĩ "https" sẽ được mở khi chúng ta vào những link yêu cầu nhập thông tin cá nhân trên 1 website là hợp lý nhất vì những trang đó ít khi kèm các link external ( ví dụ như : login, register... )
bạn xem thêm cái này http://googleonlinesecurity.blogspot.com/2011/06/trying-to-end-mixed-scripting.html.
-m
|
|
|
MrKhoai wrote:
HTTPS không phải mặc định là tại vì thêm chữ "S". Một chữ thôi nhưng server và client phải làm việc nhiều lằm.
anh không nghĩ là server và client phải làm việc quá nhiều. nhiều site lơn trên thế giới bây giờ đã triển khai mặc định HTTPS cho nhiều dịch vụ lớn của họ. em xem thêm http://www.imperialviolet.org/2010/06/25/overclocking-ssl.html.
-m
|
|
|
@freakmind, vd_: xem thêm cái này http://en.wikipedia.org/wiki/Server_Name_Indication
-m
|
|
|
maitan_10000 wrote:
Đến giờ mới biết được anh Thái là admin tại đây. Chưa đủ trình độ để đọc bài của anh nhưng cũng đánh giấu, say này sẽ đọc. Cám ơn anh đã bỏ thời gian viết những bài viết hữu ích như vậy, chúc anh sức khoẻ.
cảm ơn bạn. mình tò mò là chỗ nào trong bài viết vượt quá trình độ của bạn? tự vì mình cũng đã rất cố gắng để cho bài viết dễ hiểu, không đòi hiểu kiến thức quá cao siêu, mà chỉ là kiến thức toán phổ thông.
-m
|
|
|
không phải cứ hàng khủng là tốt nha . http://vnhacker.blogspot.com/2007/07/khng-phi-c-hng-khng-l-tt.html
-m
|
|
|
mình vừa viết xong phần 2. mời các bạn xem ở http://www.procul.org/blog/2011/10/27/m%E1%BA%ADt-ma-hi%E1%BB%87n-d%E1%BA%A1i-2/. có thể đặt câu hỏi hay bình luận ở đây hoặc trên blog KHMT cũng được.
-m
|
|
|
emga wrote:
Em đang là sinh viên năm 3 ngành quản trị mạng .Thực sự từ khi bước chân vào học CNTT là em đã thấy mình chọn sai con đường rồi ,lúc đó tính thi lại nhưng mà đã già quá(e sinh năm 88 ) nên thui .Bây giờ có thể nói là "Đâm lao thì phải theo lao thôi " nhưng dù sao em cũng không tính đi tới cùng với ngành này .Chỉ mong sao ra trường kiếm đủ cơm ăn ,rồi làm thêm 1 việc khác để có chút dư giả .E xin hỏi các bác là nếu e học quản trị mạng ,e học quản trị hệ thống ,thì cần phải học những gì để sau ra trường làm được (không cần làm giỏi )miễn sao người ta không đuổi việc mình .e không muốn học lan man tại vì vốn dĩ e đã không thích rồi nên e chỉ muốn tập trung vào những gì cần thiết thôi .E mong các bác giúp đỡ nhiệt tình .
già hay trẻ là do tự bạn nghĩ thôi. mình gần 30 nhưng vẫn thấy trẻ chán, rất muốn học và làm nhiều thứ từ đầu. mình thấy là do bạn lười, chứ không phải do tuổi tác gì cả. bạn thử nghĩ xem, bạn tốt nghiệp xong, đi làm 20-30 năm một cái nghề mà bạn không thích, liệu bạn có chịu được không? đừng có lười bây giờ để rồi phải chịu đựng cả đời như thế :-p.
-m
|
|
|
Chào mọi người,
Mình có người bạn đang tìm một sysadmin cho một diễn đàn tương đối lớn ở VN. Diễn đàn này chạy vBulletin trên nền LAMP và họ đang gặp phải các vấn đề về tốc độ và sự ổn định. Họ có thể chấp nhận làm dạng tư vấn, part-time hay full-time và họ có thể trả được mức lương $1,000-$2,000/tháng, tùy theo thỏa thuận giữa hai bên.
Nếu bạn nào có hứng thú xin vui lòng gửi email về thaidn AT gmail DOT com kèm theo phác thảo kế hoạch mà bạn sẽ làm để giải quyết vấn đề này.
Xin cảm ơn,
-m
|
|
|
lovelee wrote:
Em biết là KHOÁ RIÊNG ko dùng để mã hoá, nhưng theo em tìm hiểu, thì giả sử B "ký" bằ PRIVATE-B của nó và gửi cho A. và A thẩm định lại bằng cách giải mã bằng PUBLIC-B để so sánh.
như vậy theo em hiểu là mã hoá bằng P giải mã bằng Q , và mã bằng Q thì giải mã bằng P phải ko ạ.
--> người ta gọi là kiểm tra chữ ký chứ không phải là giải mã.
--> làm sao có thể gọi là "mã hoá" khi mà khoá dùng để "giải mã" ai cũng biết?
dẫu vậy, đây là một câu hỏi hay vì nó chỉ ra được ngộ nhận của nhiều người về việc sử dụng các khoá trong các hệ mã khoá công khai. câu trả lời ngắn gọn cho trường hợp này là: không, vì cách dùng các từ "giải mã", "mã hoá" ở trong câu hỏi vừa sai về mặt thuật ngữ vừa sai về mặt kỹ thuật. để có một câu trả lời hoàn chỉnh, mình gợi ý bạn hay các bạn khác thử tìm tìm hiểu những vấn đề sau:
0. định nghĩa khoá riêng và khoá công cộng của hệ mã RSA theo sách giáo khoa (textbook RSA).
1. mã hoá: định nghĩa hàm mã hoá (encrypt) và giải mã (decrypt) của hệ mã RSA theo sách giáo khoa.
2. chữ ký điện tử: định nghĩa hàm ký (sign) và kiểm tra chữ ký (verify) theo hệ ký số RSA theo sách giáo khoa.
khi đã rõ những định nghĩa này rồi, bạn thử tìm hiểu thêm:
0. sự khác biệt giữa khoá riêng và khoá công cộng.
1. tại sao trong mã hoá người ta dùng khoá công cộng để mã hoá và khoá riêng để giải mã (mà không phải ngược lại)?
2. tại sao trong chữ ký điện tử, người ta dùng khoá riêng để ký và khoá công cộng để kiểm tra chữ ký (mà không phải ngược lại)?
3. hệ mã ElGamal và hệ ký số DSA.
-m
|
|
|
khoá riêng là dùng để ký, chứ không phải để mã hoá.
-m
|
|
|
@boom_jt, vd_: xin cảm ơn .
đây là loạt bài về BEAST mình đang viết trên http://procul.org/blog.
http://www.procul.org/blog/2011/09/30/beast-1/
http://www.procul.org/blog/2011/10/06/beast-2/
1. Giới thiệu
Bây giờ nhắc đến Netscape chắc ít người còn nhớ, nhưng trong giai đoạn đầu của cuộc cách mạng World Wide Web hồi giữa những năm 1990, Netscape có vị thế như Google hay Facebook bây giờ. Rồi cuộc chiến trình duyệt lần thứ nhất nổ ra và Netscape là kẻ bại trận dưới tay gã khổng lồ Microsoft. Từ chỗ chiếm hơn 90% thị phần trình duyệt với sản phẩm chủ lực Netscape Navigator, Netscape giờ đây không còn được mấy ai biết đến. Dẫu vậy di sản mà họ để lại vẫn rất vĩ đại.
Netscape tạo nên Mozilla và đóng góp mã nguồn vào các phiên bản trình duyệt đầu tiên của tổ chức này. Javascript, ngôn ngữ lập trình được sử dụng phổ biến nhất trên WWW, cũng là một sản phẩm của Netscape. Vậy thì Netscape có liên quan gì đến tiêu đề của bài viết này? Secure Socket Layer (SSL), bộ giao thức giữ vai trò quyết định cho sự hình thành và phát triển của thương mại điện tử, nói không ngoa cũng là niềm hi vọng của cả thế giới về sự an toàn và riêng tư trên Internet, cũng được tạo ra ở Netscape.
Netscape làm xong SSL 1.0 từ năm 1994, nhưng phiên bản này chưa bao giờ được công bố. SSL 2.0 được công bố rộng rãi vào tháng Hai năm 1995. Không lâu sau đó người ta phát hiện ra nhiều vấn đề nghiêm trọng với bộ giao thức này nên vào năm 1996, Netscape phát hành SSL 3.0 với nhiều cải tiến nhằm sửa các lỗ hổng ở SSL 2.0. IETF, tổ chức quy định các tiêu chuẩn trên Internet, chuẩn hóa SSL và tạo ra Transportation Layer Security (TLS) và phát hành TLS 1.0 vào năm 1999.
Năm 2002, trong một email với nhan đề “An attack against SSH2 protocol” -1- gửi đến nhóm phát triển OpenSSH, Wei Dai mô tả một tấn công chọn bản rõ (chosen-plaintext attack) vào cơ chế hoạt động CBC -2- (cipher-block chaining) của các mã khối (block cipher). Tấn công của Wei Dai dựa trên một ý kiến của Phillip Rogaway đưa ra từ năm 1995, khi ông bàn về các điểm yếu trong việc sử dụng mật mã của giao thức IPSEC. -3-
Không lâu sau đó, Bodo Möller, lập trình viên của dự án OpenSSL, nhận thấy tấn công của Rogaway-Dai có thể áp dụng được cho giao thức SSL 3.0 và TLS 1.0. Ông đề xuất một giải pháp khá thông minh, tạm gọi là giải pháp OpenSSL -4- (chi tiết tôi sẽ nói sau) và tích hợp giải pháp đó vào phiên bản OpenSSL 0.9.6d phát hành giữa năm 2002. Tuy vậy, do gặp vấn đề về tương thích với trình duyệt Internet Explorer 6 của Microsoft (ai mà không gặp vấn đề này?), nên giải pháp OpenSSL thường bị gỡ bỏ trong các cài đặt của OpenSSL.
Ngoài OpenSSL ra, không một nhà phát triển SSL nào quan tâm đến tấn công Rogaway-Dai, vì ý tưởng này được xem là chỉ có ý nghĩa về mặt lý thuyết. Không ai nghĩ rằng có thể xây dựng được một tấn công thực thụ vào các ứng dụng SSL từ ý tưởng này, ngoại trừ Gregory Bard. Lần lượt trong hai năm, 2004 và 2006, Bard thử áp dụng tấn công Rogaway-Dai vào SSL trong trình duyệt -5- và SSL trong VPN -6-. Mặc dù Bard đã cho thấy được “diện mạo” của tấn công Rogaway-Dai khi áp dụng vào SSL sẽ ra sao, nhưng các tấn công của Bard vẫn không thể áp dụng được trong thực tế (tôi sẽ quay lại điểm này sau).
Trong khi đó, để ngăn chặn triệt để tấn công Rogaway-Dai, IETF quyết định chỉnh sửa TLS 1.0 và phát hành TLS 1.1 vào năm 2006. Đây là một điều chỉnh lớn, bởi vì TLS 1.1 (và TLS 1.2) không tương thích với TLS 1.0 và SSL 3.0. Đối với IETF, tấn công Rogaway-Dai, tồn tại trong hơn 11 năm từ những phiên bản đầu tiên của SSL, xem như là đã được giải quyết rốt ráo. Cho đến khi B.E.A.S.T được giới thiệu trong thời gian gần đây.
BEAST áp dụng Rogaway-Dai để tấn công vào giao thức HTTPS. Nếu như trước đây các tấn công vào HTTPS vốn chỉ tập trung vào việc khai thác điểm yếu của hạ tầng khóa công khai/chứng chỉ số thì BEAST thực sự giải mã các yêu cầu mà trình duyệt gửi đến máy chủ xuyên qua HTTPS, rồi lấy trộm các bánh quy HTTP (HTTP cookie). Trong số các ý kiến bình luận về BEAST, tôi thích nhất ý kiến của Karsten Nohl -7-:
The TLS exploit is a neat fusion of two streams in vulnerability research: Cryptanalysis and client-side attacks. In this case, a known client-side problem–namely (that) Web sites are not shielded from one another–is used to break an assumption in cryptography–that a user’s computer will not attack the user.
Users already need to trust all the Web sites they are visiting due to vulnerabilities in their browsers (“drive-by exploits”) and in trusted Web sites (“tab-nabbing”). The new exploit strongly reminds us of this rule.
BEAST chỉ ra rằng: do tính chất liên kết của Web, rất dễ để thực hiện tấn công chọn bản rõ vào HTTPS. Một website bất kỳ có thể khiến trình duyệt của bạn mở một kết nối HTTPS đến một website khác và trong các kết nối đó, kẻ tấn công kiểm soát được phần lớn nội dung. Nói cách khác, BEAST có thể dễ dàng biến trình duyệt thành một encryption oracle, rồi cứ lần lượt gửi bản rõ vào, quan sát bản mã và lập lại (adaptive chosen-plaintext attack).
2. CBC - Tấn công Rogaway-Dai
2.1 CBC
Trong định nghĩa của mỗi mã khối (block cipher) đều có một thuật toán mã hóa nhận vào một khối bản rõ (plaintext block) có chiều dài b bit (gọi là chiều dài khối - block size) và một khóa có chiều dài n bit, rồi "nhào trộn" bản rõ và khóa lại với nhau để xuất ra một khối bản mã (ciphertext block) có b bit. Ví dụ như thuật toán mã hóa của mã khối nổi tiếng DES nhận vào một khối bản rõ có chiều dài 64 bit và một khóa có chiều dài 56 bit, rồi xuất ra một khối bản mã có chiều dài 64 bit. Vì lý do an toàn, các mã khối hiện đại thường có b = 128 và n >= 128, ví dụ như AES-128, AES-192, AES-256 (con số phía sau là chiều dài khóa; tất cả đều có chiều dài khối là 128 bit). Câu hỏi tự nhiên là mã hóa thế nào nếu bản rõ dài hơn b? Chẳng hạn như tôi cần phải làm sao nếu muốn dùng AES-128 để mã hóa bài viết này, vốn chắc chắn dài hơn 128 bit?
Để giải quyết vấn đề này, người ta dùng một phương thức hoạt động (mode of operation) của mã khối. Lưu ý rằng cùng một phương thức hoạt động có thể sử dụng cho nhiều mã khối khác nhau và ngược lại. Mỗi phương thức hoạt động sẽ định nghĩa hai thuật toán: mã hóa và giải mã. Các thuật toán này sẽ sử dụng mã khối và một khóa duy nhất để mã hóa/giải mã các khối dữ liệu có chiều dài lớn hơn b. Có nhiều phương thức hoạt động, phổ biến nhất là Electronic Code Book (ECB) và Cipher Block Chaining (CBC). Để mã hóa bằng ECB hay CBC, chúng ta cần phải thực hiện hai bước:
i) Nếu chiều dài bản rõ không chia hết cho chiều dài khối thì đệm thêm (pad) một số byte vào bản rõ (padding bytes) để tổng chiều dài chia hết cho $latex b$. Có nhiều cách đệm, phổ biến nhất là đệm theo chuẩn PKCS #5 -8-.
ii) Chia bản rõ ra thành từng khối và mã hóa theo thuật toán quy định trong phương thức hoạt động. Tôi sẽ đi vào chi tiết bước này trong cả hai phương thức ECB và CBC ngay bên dưới.
Điều thú vị là cả hai thao tác này đều đã tạo ra những tấn công rất nghiêm trọng vào các ứng dụng của mã khối trong thực tế. Ví dụ như đối với bước thứ nhất, ở Eurocrypt 2002 Serge Vaudenay đã trình bày tấn công padding oracle -9-, một tấn công chọn bản mã (chosen-ciphertext attack) cho phép kẻ tấn công có thể giải mã bất kỳ bản mã nào, chỉ với một điều kiện là nạn nhân tiết lộ kết quả gỡ đệm trong quá trình giải mã. Sau Vaudenay, đã có rất nhiều nghiên cứu khác về tấn công padding oracle -10-. Tôi và một đồng nghiệp cũng có hai nghiên cứu về đề tài này -11, 12-. Tuy vậy, BEAST không phải là một tấn công padding oracle, nên từ đây về sau chúng ta xem như các bản rõ đều đã được thêm đệm cho phù hợp.
Tôi dùng một số ký hiệu sau đây cho phần còn lại của loạt bài này:
Code:
Bản rõ được ký hiệu là M, bản mã là C. Bản rõ được chia ra thành m khối P_1, P_2,...,P_m. Các khối này sẽ được mã hóa thành C_1, C_2,...,C_m.
Hàm mã hóa của mã khối là E_k, trong đó k là khóa. Tương ứng, hàm giải mã là D_k.
Viết X = {X_1}|{X_2}|\cdots|{X_m} nghĩa là kết nối các khối X_i lại với nhau để tạo ra khối X.
Vector khởi tạo (initialization vector) được ký hiệu là IV.
Phương thức hoạt động đơn giản nhất là ECB. ECB mã hóa các khối bản rõ độc lập với nhau, cụ thể như sau:
Code:
Mã hóa
C_i = E_k(P_i), i=1,..,m
C = C_1|C_2|...|C_m
Giải mã
P_i = D_k(C_i), i=1,..,m
M = P_1|P_2|...|P_m
Phương thức mã hóa độc lập này có một tính chất: các khối bản rõ giống nhau sẽ cho kết quả là các khối bản mã giống nhau. Nói cách khác, so sánh giá trị của C_i và C_j với i, j bất kỳ chúng ta có thể biết được một chút "thông tin" về P_i và P_j. Đây là một tính chất không mong muốn của bất kỳ phương thức hoạt động hay hệ mã nào (bởi vì nó làm cho hệ mã không còn an toàn theo định nghĩa semantic security -13-). Điều thú vị là ECB được chọn là phương thức mặc định trong nhiều thư viện lập trình phổ biến.
Bài tập 1: Quân ta đang ở chiến trường. Mỗi ngày bộ chỉ huy sẽ gửi ra một lệnh cho biết hôm đó quân ta sẽ làm gì. Chỉ có hai lệnh: "TAN CONG" hoặc "PHONG THU". Do quân địch cũng có thể nghe lén sóng radio, nên để cho an toàn, bộ chỉ huy sử dụng ECB để mã hóa các lệnh trước khi gửi. Tất cả các lệnh đều được mã hóa bằng cùng một khóa duy nhất. Chứng minh rằng ngay trong ngày thứ hai, quân địch đã có thể đoán trước chiến thuật của quân ta.
Bài tập 2: Tìm và liệt kê các thư viện lập trình sử dụng ECB là phương thức hoạt động mặc định. Điểm thưởng: tìm trên Google Code Search các chương trình sử dụng các thư viện này và xem thử có cách nào khai thác điểm yếu của ECB trong các chương trình này hay không.
Vậy làm thế nào để phá vỡ sự độc lập giữa các khối? Làm cho chúng phụ thuộc nhau . Đó cũng là ý tưởng của phương thức CBC. Tên gọi của CBC gợi ý rằng các khối bản mã sẽ được "móc nối" lại với nhau, cụ thể như sau:
Code:
Mã hóa
C_0 = IV
C_i = E_k(P_i \oplus C_{i-1}), i=1,..,m
C = C_0|C_1|C_2|\cdots|C_m
Giải mã
P_i = D_k(C_i) \oplus C_{i-1}, i=1,..,m
M = P_1|P_2|\cdots|P_m
Lưu ý rằng khi mã hóa bằng CBC, chiều dài bản mã tăng thêm một khối. Khối tăng thêm này là IV, dùng để mã hóa khối bản rõ đầu tiên. Trong CBC, IV không cần được giữ bí mật, nhưng với cùng một khóa thì IV phải độc nhất và không dự đoán được.
Bài tập 3: Giả sử bộ chỉ huy ở bài tập 1 chuyển sang sử dụng CBC. Vì thiếu thiết bị tạo số ngẫu nhiên, bộ chỉ huy quyết định chọn một IV cố định và dùng IV này trong tất cả các lần gửi lệnh. Chứng minh rằng quân địch vẫn có thể đoán trước chiến thuật của quân ta ngay trong ngày thứ hai.
CBC được sử dụng ở rất nhiều ứng dụng của mã khối, trong đó có SSL/TLS. Điểm mấu chốt trong việc sử dụng CBC chính là chọn lựa IV đảm bảo hai tiêu chí ở trên. Rất tiếc người thiết kế SSL/TLS làm sai chỗ này. Bài tập 3 gợi ý rằng, để có IV độc nhất thì nên dùng một bộ tạo số ngẫu nhiên (random number generator). Lưu ý là không phải bộ tạo số nào cũng có thể dùng trong mật mã và hầu hết các bộ tạo số ngẫu nhiên đi kèm theo các ngôn ngữ lập trình đều không an toàn. Có lẽ tôi sẽ viết một bài về đề tài này sau. Quay trở lại giá trị IV. Như vậy trong CBC, mỗi lần mã hóa, chúng ta nên chọn một IV ngẫu nhiên. Câu hỏi là: ngẫu nhiên có bao hàm không dự đoán được? Chắc chắn rồi, bởi nếu đã là ngẫu nhiên thì làm sao mà dự đoán được! Tôi nghĩ sự tồn tại của điểm yếu trong SSL/TLS, tấn công Rogaway-Dai và bây giờ là BEAST đều xuất phát từ chỗ này. Cách mà SSL/TLS chọn các IV để mã hóa các bản ghi (record) khiến các IV này ngẫu nhiên, nhưng lại dự đoán được!
Trong SSL/TLS, dữ liệu từ tầng ứng dụng được chia ra thành từng bản ghi dài không quá $latex 2^{14}$ byte, rồi các bản ghi này sẽ được mã hóa dùng CBC. Với bản ghi đầu tiên, SSL/TLS sẽ chọn một $latex IV$ hoàn toàn ngẫu nhiên từ bộ tạo số ngẫu nhiên. Từ bản ghi thứ hai trở đi, SSL/TLS sẽ chọn khối bản mã cuối cùng của bản ghi trước đó làm IV. Ví dụ như bản ghi thứ nhất có 3 khối $latex P_1, P_2, P_3$, mã hóa tạo thành 4 khối C_0, C_1, C_2, C_3, thì C_3 sẽ được chọn làm IV cho bản ghi thứ hai. Rồi khối bản mã cuối cùng của bản ghi thứ hai sẽ là $latex IV$ cho bản ghi thứ ba, v.v. Lưu ý rằng C_3 là hoàn toàn ngẫu nhiên, nhưng nếu như chúng ta biết C_3 trước khi chọn bản ghi thứ hai thì xem như IV của bản ghi thứ hai là dự đoán được. Nói cách khác, IV không dự đoán được nghĩa là chúng ta không thể biết được giá trị của IV trước khi chọn bản rõ.
Vậy chuyện gì sẽ xảy ra nếu chúng ta dự đoán được IV trước khi chọn bản rõ?
2.2 Tấn công Rogaway-Dai
Wei Dai mô tả như sau tấn công này như sau:
Wei Dai wrote:
Phil Rogaway observed that CBC mode is not secure against chosen-plaintext attack if the IV is known or can be predicted by the attacker before he choses his plaintext [1]. Similarly, CBC mode is not secure if the attacker can observe the last ciphertext block before choosing the next block of plaintext, because the last block of ciphertext essentially serves as the IV for the rest of the message.
The attack itself is very simple. Remember that in CBC mode, each plaintext block is XOR'ed with the last ciphertext block and then encrypted to produce the next ciphertext block. Suppose the attacker suspects that plaintext block P_i might be x, and wants to test whether that's the case, he would choose the next plaintext block P_j to be x XOR C_(i-1) XOR C_(j-1). If his guess is correct, then C_j = Encrypt(P_j XOR C_(j-1)) = Encrypt(P_i XOR C_(i-1)) = C_i, and so he can confirm his guess by looking at whether C_j = C_i. [...]
[1] http://www.cs.ucdavis.edu/~rogaway/papers/draft-rogaway-ipsec-comments-00.txt
Như vậy Dai chỉ ra rằng chúng ta có thể dự đoán được (giải mã!) bản rõ đã quan sát nếu chúng ta biết được IV trước khi chọn bản rõ mới trong CBC. Nếu P_i chỉ nhận 100 giá trị, thì rõ ràng chúng ta có thể giải mã được P_i sau khi thực hiện trung bình 50 bước chọn và thử P_j. Giới hạn của Rogaway-Dai nằm ở chỗ trong thực tế miền giá trị của P_i thường rất lớn. Làm sao để giảm miền giá trị của P_i?
(Phần 3: Tấn công chọn lề)
Các liên kết trong bài:
1. http://www.mail-archive.com/openssl-dev@openssl.org/msg10664.html
2. http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
3. http://www.cs.ucdavis.edu/~rogaway/papers/draft-rogaway-ipsec-comments-00.txt
4. http://www.openssl.org/~bodo/tls-cbc.txt
5. http://eprint.iacr.org/2004/111
6. http://eprint.iacr.org/2006/136
7. http://news.cnet.com/8301-30685_3-20108633-264/researchers-to-detail-hole-in-web-encryption/
8. http://www.rsa.com/rsalabs/node.asp?id=2127
9. http://lasecwww.epfl.ch/memo/memo_ssl.shtml
10. http://scholar.google.com/scholar?q=padding+oracle&hl=en&btnG=Search&as_sdt=1%2C5&as_sdtp=on
11. http://usenix.org/events/woot10/tech/full_papers/Rizzo.pdf
12. http://www.ieee-security.org/TC/SP2011/PAPERS/2011/paper030.pdf
13. http://en.wikipedia.org/wiki/Semantic_security
|
|
|
Chào bà con,
Như đã có lần nói trên HVA, tuần vừa rồi mình và một người bạn vừa trình bày BEAST, một cách tấn công chọn bản rõ mới vào HTTPS. Các bạn có thể xem demo ở http://www.youtube.com/watch?v=BTqAIDVUvrU và tìm đọc phiên bản rò rỉ của paper ở http://www.insecure.cl/Beast-SSL.rar. Bài dưới đây là mình viết trên blog cá nhân về quá trình nghiên cứu BEAST. Đọc nó mình nghĩ là thú vị hơn đọc paper . Ở đây thiếu mấy cái liên kết, nên bạn nào muốn truy cập mấy cái liên kết thì qua http://vnhacker.blogspot.com/2011/09/beast.html.
-m
---
So we gave a talk and a live demo at ekoparty last week to show how BEAST exploits a weakness in SSL to decrypt secret cookies.
Please note that BEAST does not do any harm to remote servers. In fact, no packet from BEAST has ever been sent to any servers. We chose PayPal because they do everything right when it comes to server-side SSL, and that is good to demonstrate the power of BEAST, which is a client-side SSL attack. We reported the vulnerability to browser, plugin and SSL vendors several months ago (CVE-2011-3389).
Current version of BEAST consists of Javascript/applet agents and a network sniffer. We have some choices for the agent. At the time we reported the bug to vendors, HTML5 WebSockets could be used to build a BEAST agent but, due to unrelated reasons, the WebSockets protocol was already in the process of changing in such a way that stopped it. We can't use the new WebSockets protocol shipped with browsers. We use a Java applet in this video, but please be aware that it may be possible to implement a Javascript agent with XMLHttpRequest as well. Why don't you take a look?
Note that it is relatively easy to run a script or an applet in your browser without you doing anything (e.g, by intercepting any HTTP requests from your browser.) After all, each agent is just a piece of Javascript or an applet. Once an agent has been loaded, BEAST can patiently wait until you sign in to some valuable websites to steal your accounts.
In order to make the Java applet agent work, we have to bypass the same-origin policy (SOP). Some people have gotten the impression that BEAST required an SOP bypass bug to work and so it's not a threat by itself. That's not true. It is well known that even with a SOP bypass in Java, you can't read existing cookies. You can send requests and may read responses (which may include new cookies), but no, you can't read existing cookies. In the video (and the live demo as well,) we show clearly that we decrypt _existing_ cookies that were already stored in the browser's cookie jar. During our research, we indeed found a Java SOP bypass. We wanted to focus on more important parts of BEAST such as the actual crypto attack and optimizations, so we stopped looking for alternatives, and used the SOP vulnerability to make an agent.
A. Shamir (the S in RSA) once said "Cryptography is typically bypassed, not penetrated," and please keep reading if you are curious what happened during our anecdote of penetrating crypto.
It began with the alleged backdoor in OpenBSD's IPSEC stack. One day in late December 2010 Juliano sent me an email telling me that he got a new idea. He was at some beach in Indonesia reading tls-cbc.txt (I know that beach and TLS and CBC should not appear in the same sentence but, well, maybe he's not very interested in bikinis) and he came up with the chosen-boundary attack. In hindsight, it's obvious that somebody would think of that when they read about Dai's attack. In hindsight, however, everything is obvious. It takes somebody like Juliano to have such a good idea. I am so lucky that he always shares his ideas with me. I wrote some test cases (using the wonderful tlslite library), and after some hours, my conclusion was... it can't work in browsers. I then moved to the States, and was busy with new life, new job and schooling, so I didn't have time to research that idea any further, even after Juliano kept asking me to check it again. Don't listen to me if I tell you your attack can't work . Don't listen to anybody telling you that.
Fast forward to early April. I was working on some project at Matasano, and some SSL code that I saw that day made me realize that I wrote wrong tests for Juliano's idea. In fact, it seems that I didn't quite understand it back then. As soon as I got back home, I re-read Juliano's email, my notes and scripts. I decided that I needed to make it work with pen and paper first, so I drew some diagrams. The result looked hopeful. I then modified the test cases, re-ran them, and for the first time, I saw that chosen-boundary attack may work. That moment was so wonderful. It turns out that I had to "reverse" the idea to make it "compatible" with browsers, and after some more hours, not only I saw that the attack is possible, but I also understood which conditions I need to make it really work. The conditions looked easy too. I was very excited. I would have screamed loudly hahaha. I took note of what I had seen so far, and sent it to Juliano.
At first, Juliano didn't understand my note (because it's a reverse of his idea,) but he caught up very quickly, and he agreed that it looks doable. So the main condition is to be able to send two SSL records in the same cookie-bearing request (if you've read the leaked draft, we call this the blockwise privilege.) We were both very excited, because at that moment we know that it is just a matter of browser features for us to create a reliable exploit for something that people have thought un-exploitable in years.
I collected a list of browser features and plugins that allow me to send cookie-bearing requests. I took a look at the Browser Security Handbook by Michal Zalewski, and found some candidates: Javascript XMLHttpRequest, Java URLConnection, Flash URLRequest, and Silverlight WebClient API. We really wanted to make the attack work with native Javascript, so we spent a lot of time on XMLHttpRequest object. At some point, Juliano and I were even reading C++ source code of various browsers (which is even harder to understand than assembly as a friend once said.) Maybe we've missed something really obvious, but we've never made XMLHttpRequest work the way we need. It was both surprising and frustrating that it is so hard to do request streaming in modern browsers. People have to invent a lot of ugly bitches that known as Comet techniques. I studied every single one of them, but none of them meets what we need. I also studied HTML5 WebSockets, then concluded that it's not what I need because it includes a \x00 byte in front of every packet. More about WebSockets in a moment.
So I moved on to Java URLConnection. I'd never written an applet before, but researching is doing exactly things that you haven't done before. So I wrote an applet, and tried to make it perform the blockwise step. The Internet is really helpful. I found a wonderful URLConnection mini-guide in Stack Overflow. I also wrote a small SSL server to test my applet. It worked as expected. I could open a request, append more data to it as long as I want, and each time I "flush" the output stream, Java would send out a record in the same SSL connection. So wonderful, but I want more. I want something that works without any plugins. Once again I started writing tests for XMLHttpRequest, reading C++ code, or studying Comet. Rinse and repeat. Nothing worked.
One day while in the shower, I realized that those things haven't worked simply because they can't work. That's why people have to invent WebSockets. Hmm, why couldn't I use WebSockets? I re-read my note. So they have a \x00 prefix, which prevents me from fully controlling the chosen block. I remembered that Bellare et al. also had the same problem when they tried to attack SSH, so I re-read their paper. I was quite disappointed to know that they didn't describe any practical way to solve that problem. Then I came up with the idea of chaining of predictable IV. I wrote a small WebSockets simulator to test it, and it works. Not very fast though, since WebSockets requires that my chosen block to be a valid UTF-8 string. It's funny that we also had to deal with UTF-8 in the ASP.NET exploit. Anyway, it doesn't need any plugins. It was late April.
We split the work. I wanted to work on the paper, and Juliano wanted to work on the exploit. I started writing right away, but Juliano had to delay the exploit several months later. He got a name for it anyway. "This thing is so complicated. I would like to call it B.E.A.S.T so people kind of get stuck calling it 'the BEAST attack'. We can figure out what BEAST means later."
Writing in English has never been easy for both of us. It took us several months with a lot of help from friends to finish the ASP.NET paper, and I couldn't believe that I had to write another one even before releasing that paper. But I did eventually. Along the way, I found Bard's papers, which was extremely helpful for me. I read his paper carefully. So many "We believe". I have to confess that I am a non-believer, so I made a rule for myself: no "We believe" in my paper. Anyway, although Bard's attacks can't work, his papers were written in very nice English. So I stole a lot of phrases, expressions and statements from him. Of course I cited him many times.
So I kept writing, and Juliano helped with editing. By mid May, we finally had something good enough to ask for review from friends. I guess that no "We believe" is a good rule, since everybody said that the paper is easy to understand. We also got an awesome review from Kenny Paterson. If you happen to write a crypto paper, and need some cryptographer to review it, you may want to ask Kenny. He's very friendly, encouraging, and his review always teaches us a lot.
So we got a not-so-bad paper, but still no actual exploit because Juliano was still in some beach somewhere. We agreed that we should contact browser and SSL vendors early so that they can work on the patch, since we planned to (but didn't) release something in July. We sent the paper to Google, Mozilla, Apple, Microsoft, Opera and Oracle. All of them responded very quickly, which is pretty impressing. Mozilla created bug 665814, and it became the discussion board of all people working on the fix. Later I discovered that there were also people from IETF and other vendors that we didn't contact.
It turns out that fixing this is not easy, because every proposed solution is incompatible with some existing SSL applications. OpenSSL has already included a fix several years ago, but it is turned off by default, thanks to Internet Explorer 6's broken SSL implementation. Somebody also pointed out that due to another attack released in March, the WebSockets protocol was already in the process of changing in such a way that stopped our attack. People kept asking for a working PoC, but we could not give them anything. At some point, it seemed that no vendor wanted to patch this. We also started losing interest in convincing them. We got more compliments from cryptographers we contacted.
We didn't release anything in July as planned, since nothing has been fixed. Instead we went to BlackHat, won a pwnie for the ASP.NET bug, delivered a presentation on the attack at Matasano's private dinner. People liked it. We got several follow-up emails and an invitation to present it again at some internal conference of a client. Juliano and some other friends rooted all servers and yet lost their CTF game. Still no actually BEAST. "We can work together on BEAST when I visit you next week", but we ended up drinking all nights. So many hi 5...
Then Juliano submited the talk to ekoparty. Opera patched. We got excited. That was five weeks ago.
Juliano told me that the talk got 10/10 rating from all of the judges, and he felt that it's time to give birth to BEAST. Since WebSockets is not a good option anymore, and there was so little time to research other alternatives, we agreed that we should focus on Java and Silverlight. He worked and worked and worked. It turns out that BEAST is not easy to code. At some point, Juliano had to install Windows and Visual Studio to write a Silverlight applet in, cough cough, VB.NET. Well, he has to do things he's never done before.
BEAST finally decrypted the first byte of some cookies. It is so surreal to witness some idea that exists only in your mind actually evolves into working code. Moments like this are very rewarding, and it makes researching very worth doing. Juliano was so tired, so I asked him to send the code to me. This is why we've enjoyed doing things together. We can make progress as long as there is at least one guy up. He has done the heavy work, now it's my turn to baby-sit BEAST.
I installed Eclipse, learned Java, and started hacking the code. Since Juliano stopped as soon as BEAST decrypts the first byte, I had to fix bugs to make it decrypt more bytes more reliably. The next thing I did was to find a way to bypass the same-origin policy (SOP) with some agent. A friend was so generous that he gave me one of his Java 0-days to bypass SOP. Anyway, that bug has a dependency that we couldn't satisfy, so I had to find another one. I started reviewing JVM's source code. Honestly, I didn't expect to find a SOP bypass, but I did. What interesting is that the bug is very good for BEAST, but not so good for other types of attackers. You need to be able to do MiTM to use it. Well, that makes sense when you know that I found the bug when I was MiTM-ing a Java applet. I could look for other ways to create an agent, but both of us agreed that we should focus on optimizations. I needed to make BEAST fast. The version that Juliano sent me was so slow that all we got were expired cookies. BEAST is just a baby, it deserves fresh cookies. I spent the last week or so working on that. As you see in the demo, BEAST now takes minutes to decrypt very long unexpired cookies.
In summary, we had an idea, and we've done several things we've never done before to make it work. That's our story of penetrating crypto. Thank you for your time.
Thanks to Marsh Ray and Juliano Rizzo for reading and editing drafts of this.
Update 9/26/2011: correct some spelling and grammar errors.
|
|
|
vd_ wrote:
@jin9x
@mrro
b3. việc phát biện bộ quét virus có thể sử dụng 1 cách đơn giản là sử dụng các mẫu đặc biệt mà 1 engine này phát hiện, nhưng engine khác không phát hiện (virustotal?). Không dễ, nhưng tui nghĩ là khả thi. Về phía defense, sử dụng 2 engine hoặc là sử dụng 1 engine, nhưng hiển thị cho user là engine khác cũng có 1 ít tác dụng (ví dụ yahoo nói sử dụng Norton, nhưng sao biết chắc là nó sử dụng Norton?)
regex viết nhanh (chưa đầy đủ) của url /^https?:\/\/[a-zA-Z0-9_\.-]+\/[a-zA-Z0-9_\.-\/~]+/
biểu thức chính quy vẫn có rủi ro đối với bản thân parser & execution engine của regex (lỗi BO?) . Còn một vấn đề nữa là hình như url giờ có utf8 (non-English) nên regex sẽ khá phức tạp nếu muốn user có thể sử dụng được dịch vụ ở mọi nơi.
tui có 1 ý nghĩ là sao ko dùng các technique của AI: machine learning, pattern recognition (neuron network, empirical analysis, ....) để cho điểm và đánh giá nội dung attachment. Ví dụ sau khi phân tích, ta có điểm 4/10 -> hiện ra visual notification cho user là attachment này likely - unlikely harmful để tự bản thân user chọn -> adjust điểm (giống crowd sourcing)
- ý kiến sử dụng virustotal để xác định bộ lọc virus của bạn rất hay! về phần phòng thủ thì bạn nghĩ sử dụng 2 bộ lọc thì người ở ngoài sẽ không thể xác định hai bộ lọc đó là gì? cá nhân mình cho rằng sử dụng càng nhiều bộ lọc thì càng giảm độ an toàn, đơn giản vì mỗi bộ lọc giống như một dịch vụ, càng bày ra nhiều thì càng có nguy cơ cao. thành ra cứ tạm thời cho là kẻ tấn công sẽ biết được bộ lọc virus đang được sử dụng và rất có thể bộ lọc virus có lỗi, vậy có cách nào giảm thiểu thiệt hại hay không?
- nếu chỉ sử dụng biểu thức chính quy mà bạn đưa ra, thì kẻ tấn công vẫn có thể nhập vào chẳng hạn như http://127.0.0.1:22/ hoặc http://192.168.1.1:80/ để quét cổng như đã nói ở trên. vậy nên sửa lại như thế nào bây giờ?
- bạn có thể giải thích cái ý hình như url giờ có utf8 (non-English)? hi hi như đã nói ở trên, nên cẩn thận khi trả lời câu hỏi, nếu mà chưa nắm vững thì tốt nhất là không nên nói ra.
- các ý về AI của bạn đưa ra rất lý thú. bài toán này mà có thể xem là bài toán phân loại, một ứng dụng hết sức phổ biến của AI. câu hỏi là: thực hiện cụ thể làm sao? mô hình của bạn là gì? bạn sẽ sử dụng thuật toán nào?
-m
|
|
|
jin9x wrote:
4a. Cho GMail request đến server của mình, ở server mình cho sniff để lấy những thông tin của kết nối đó, sau đó dựa vào những thông tin đó để "đoán" (nhưng chắc là đoán không ra vì nhiều khả năng Gmail sử dụng công cụ riêng của họ)
4b. Để kiểm tra thì chỉ càn cho nó "xem" một đoạn javascript có chức năng gửi một request đến server mình và cho sniff thôi.
có request => đoạn js được thực thi => "cái gì đó" hiểu được js
--->Vấn đề này có thể nảy sinh nhiều vấn đề bảo mật khác, có thể áp dụng khai thác XSS, CRSF ... vào js mà
4a. ý kiến hay lắm. chuyện đoán ra hay không thì tùy trường hợp, ở đây mình chỉ bàn đến phương pháp thôi, và ý kiến của bạn là rất chính xác. thế bây giờ giả sử bạn thấy họ dùng thư viện của Java để tải file về, thì bạn sẽ làm gì tiếp theo?
4b. xuất sắc . giờ câu hỏi là làm sao để xác định được họ dùng bộ xử lý Javascript nào để thực thi Javascript? sau khi đã xác định được bộ xử lý Javascript rồi, thì nên làm gì tiếp theo?
---> cụ thể là khai thác thế nào? hi hi từ đầu đến giờ nếu bạn nào để ý sẽ thấy là mình yêu cầu mỗi lời nói ra đều phải có dẫn chứng cụ thể, rành mạch, không cho phép nói suông.
-m
|
|
|
vd_ wrote:
b3. cái vụ bo này thì tui chỉ tạm biết là nếu giờ cho load file đủ lớn chứa toàn là AAAA hay gì đó, nếu gmail temporarily out of service sau khi attach -> crash service -> có khả năng stack/mem bị overwrite ở đâu đó -> rồi ROP hay gì đó nữa.
chi tiết hơn tui phải nghiên cứu thêm về RoP và đọc thêm về BO mới rõ được, còn trên chỉ là nguyên lý tui nhớ mang máng
@gamma95: ý 2&3 rất hay -> sẽ phải sanitize user input. Mà thường nguyên lý là không bao giờ tin user input nên việc kiểm tra bad url sẽ được thực hiện đầu tiên -> việc malicious server host valid url sẽ có hiệu quả hơn.
nhân tiện đặt thêm câu hỏi: url valid trong trường hợp này sẽ là gì? nếu kiểm tra valid url (http/https only, no port, no user@pass) thì có thể fix được một số vấn đề đang thảo luận hay không?
b3. cách làm này hơi vội. trước tiên bạn phải xác định được bộ phát hiện và diệt virus nào đang được sử dụng đã. ngược lại ở vị trí phòng thủ, bạn làm sao để che dấu thông tin về bộ phát hiện và diệt virus mà bạn đang sử dụng?
---> bạn đưa ra một ý hay là phần user@password, làm mình nhớ đến một hướng lợi dụng tính năng này là dùng nó để dò tài khoản trên các máy chủ khác sử dụng HTTP Basic Authentication.
---> bạn nghĩ nếu kiểm tra URL thì nên có những quy định nào? một cách kiểm tra thông thường là dùng biểu thức chính quy, vậy cụ thể ở đây biểu thức chính quy nào nên được sử dụng? nếu chỉ dùng biểu thức chính quy không thì có đủ hay không?
-m
|
|
|
gamma95 wrote:
1. Cho một cái URL dạng live streaming, máy chủ google cứ tải cái file đó hoài và crash vì hết đĩa
2. Cho 1 cái URL để download một cái file có tên là \..\..\..\..\..\boot.ini chẳng hạn, nếu có có dùng AV để quét hoặc gì đó hoặc attachfile lên cho mềnh thì ngon.
3. URL nó hỗ trợ protocol nào thì mình test cái đó, VD mình nhập file:///etc/passwd chẳng hạn, file attach mình nhận đc sẽ là file /etc/passwd của google.
vấn đề giờ là lúc này gmail coi như là 1 client và đang "duyệt web" của attacker(vì attackers đang bắt gmail phải chạy những URL mà mình input vào ), tiếp theo là:
4. Tui cho gmail vô cái link http://gamma-dep-trai.com và sniff lại thử coi gmail đang dùng "cái gì" để __browse__ vô web của tui. Việc thứ 2 là coi "browser" của gmail nó có chạy được mấy cái scripting language ở client như js, vb, flash ... như những browser khác hay ko. Nếu con crawler thông minh quá có thể chạy đc cả js chẳng hạn thì có nhiều chuyện để nói lắm nha
5. Khi tui biết cái ip của con crawler gmail rồi thì vấn đề tiếp theo tui sẽ ráng dùng những patterns có sẵn của để tấn công webserver, web app, etc và bắt crawler của gmail đập vào những ip cùng subnet với nó (nhiều khả năng là những server khác của google).
6. thử test coi gmail có download 1 file nhiều lần hay ko? (có thể để tối ưu hoá thời gian ngồi chờ, nó thấy file nào nó đã down rồi thì ko down nữa). Nghĩa là nếu nó checksum nếu thấy cái file đó trong db rồi thì ko cần down nữa mà lấy file cũ attach lên ... khi đó có thể đoán xem nó checksum file bằng cách nào (md5, sha-1) để làm một file khác bị collision với file cũ và sẽ tồn tại 1 url mà gmal sẽ ko bao giờ thèm download ...
cuối cùng thấy không thể trốn được nữa thì gamma95 đã xuất hiện he he he.
1. ý này trùng với ý đã được đưa ra ở trên.
2. ý hay. câu hỏi là:
2a. làm sao khiến máy chủ GMail tải về một cái file có tên như thế?
3. ý hay. thư viện tải file có thể hỗ trợ nhiều giao thức khác nhau, nên tốt nhất là thử hết.
4. ý rất hay. muốn tấn công cái gì thì trước tiên phải biết nó là cái gì đã đúng không . câu hỏi là:
4a. làm sao để xác định được GMail dùng "cái gì" để tải file về?
4b. làm sao để xác định cái đó có hỗ trợ Javascript hay không? nếu có thì có những chuyện gì để nói?
4c. ngoài ra nếu đã xác định được GMail dùng "cái gì" để tải file về, thì về nguyên tắc chúng ta nên làm gì tiếp theo để có thể tấn công vào máy chủ GMail?
5. không hiểu ý này của gamma95. chú ý là IP của crawler mà gamma95 thấy là IP không thuộc lớp IP quy định trong RFC 1918.
6. nếu GMail không thèm download thì có vấn đề gì nguy hiểm ở đây?
-m
|
|
|
b3. Scan & pattern matching có thể bị buf overflow hoặc dùng escape string để by pass nên chỉ có tác dụng một phần, không phải là giải pháp chắc chắn 100%
b4. Như jinx9 có nói, nếu yêu cầu gmail down về 1 file mà trúng server config tarpit rule thì sẽ tốn network resource để maintain connection. Hoặc là netcat /dev/random thì biết chừng nào mới down xong -> nếu để time limit thì sẽ hạn chế được long download. Trường hợp target server cố ý chỉ support http 1.0 nên gmail serrver không biết được lúc nào mới hết file.
Trường hợp target server support range (http 1.1) thì hạn chế size down để hạn chế disk usage cho server gmail.
Ý của mrro trong trường hợp 1 là để gmail scan port của chính gmail? hoặc các internal server của google?
b3. đúng rồi. giờ hỏi thêm là, làm sao để khai thác lỗi buffer overflow nếu có của bộ quét virus? đương nhiên muốn trả lời câu này thì phải trả lời làm sao xác định được bộ quét virus nào đang được sử dụng.
b4. câu trả lời xuất sắc của bạn jinx9 và vd_.
---> đúng rồi. ví dụ như mình nhập vào http://localhost:22 chẳng hạn, rất có thể phần mềm sẽ báo một lỗi gì đó, khiến mình biết được là có dịch vụ lắng nghe ở cổng 22 của máy chủ GMail, đúng không? hoặc như mình nhập vào http://x.y.z.t:w/ thì mình sẽ xác định được có cái máy nào ở địa chỉ x.y.z.t lắng nghe ở cổng w hay không, đúng không? đương nhiên là khai thác được hay không và khai thác như thế nào là chuyện đi vào chi tiết của ứng dụng, nên mình không bàn ở đây. ở đây mình chỉ đang bàn đến những cái rủi ro trong việc thiết kế một tính năng như trên.
ngoài cái ý (chưa trọn vẹn) khai thác lỗi của bộ quét virus ở trên, có bạn nào có những ý tưởng nào khác có thể dùng tấn công trực tiếp vào máy chủ GMail không?
-m
|
|
|
mình tổng kết lại một số điểm mà các bạn nói nha:
1. quét cổng/truy cập các dịch vụ bên trong (vd_, secmask): nhập vào http://localhost/ để thử xem có GMail sẽ trả về cái gì. cách làm này có thể được sử dụng để xác định dãy IP cũng như quét cổng dịch vụ của chúng trên hệ thống mạng nội bộ của GMail.
2. dùng làm proxy (nhiều bạn): tấn công DoS hoặc là khai thác các lỗi ứng dụng web phổ biến trên một ứng dụng của bên thứ ba. thực ra thì cái này cũng giống như cái thứ nhất, chỉ khác mục tiêu, nhưng cách làm là giống nhau.
cả hai điểm này đều là lợi dụng GMail để tấn công một ứng dụng khác. bây giờ mình hỏi: có cách nào để tấn công trực tiếp cái ứng dụng GMail như trên không? bạn vd_ đưa ra hai điểm hay là:
vd_ wrote:
b.3 Scan virus + pattern matching nội dung file sẽ attach để tránh các nội dung xấu
b.4 size limit & time limit cho việc download
- b.3 giúp chặn virus, nhưng mà b.3 có tạo thêm rủi ro gì không?
- tại sao lại cần b.4? nếu không có b.4 thì có rủi ro gì ở đây? nếu chỉ chặn dung lượng, mà không chặn thời gian, thì có rủi ro gì? và ngược lại?
-m
PS: đây là những câu hỏi mở, không hẳn đã có sẵn câu trả lời, nên các bạn cứ thoải mái mà đưa ý kiến.
|
|
|
Chào bà con,
Công việc của mình chủ yếu là hacking suốt ngày. Hôm nay trong lúc "trà dư tửu hậu" với gamma95 mới nảy ra ý mở một chủ đề nói về những dạng lỗi hay vấn đề mà mình gặp hàng ngày trong công việc, vừa như là ghi chép cá nhân để khi nào cần thì xem lại, vừa để chia sẻ và trao đổi với các bạn ở HVA.
Bữa nay mở đầu bằng một câu hỏi như sau:
1. Giả sử trong phần gửi mail, GMail có tính năng cho phép người dùng nhập vào một URL, rồi GMail sẽ tải cái URL đó về và biến nó thành một cái attachment. Câu hỏi là:
a) Có những rủi ro gì trong cách làm này? Nếu bạn kiểm thử cái tính năng này, thì bạn sẽ làm những bài kiểm tra nào?
b) Làm sao để đảm bảo an toàn cho một tính năng như thế?
-m
|
|
|
@lyokha: bạn hf_c500 chỉ đúng hướng rồi. mấy câu truy vấn phía sau của bồ sai là vì bồ viết nó sai thôi, xem kỹ lại đi. mà này, nếu thật sự nghiên cứu Bypass WAF trong attack SQL Injection như bồ nói, thì cho mình hỏi là:
1. tại sao lại phải đi thử với một site của ai đó, mà không phải site của bồ tự làm, rồi tự thử?
2. WAF mà bồ đang muốn thử là gì?
nếu bồ không trả lời được hai câu hỏi này, thì mình sẽ phải chuyển câu hỏi này vào thùng rác vì nó vi phạm nội qui của HVA.
-m
|
|
|
hôm nay ngồi đọc lại bài này, có phần bất ngờ là hai năm trước mình đã viết những dòng như thế này:
mrro wrote:
Một phát hiện hết sức thú vị. Thú vị ở chỗ bao nhiêu người, bao nhiêu chuyên gia, bao nhiêu năm qua dòm vô TLS/SSL mà không thấy được lỗ hổng có vẻ như rất hiển nhiên mà các tác giả ở trên phát hiện. Có lẽ nguyên nhân nhiều người dòm nhưng không thấy là vì họ chỉ dòm TLS/SSL khi nó đứng một mình, mà không nhìn vào bức tranh lớn OSI, trong đó TLS/SSL chỉ là một layer. Chuyện gì sẽ xảy ra nếu TLS/SSL không hiểu rõ cơ chế hoạt động của các protocol bên trên nó, như HTTP, SMTP hay POP3? Nói cách khác, chuyện gì sẽ xảy ra nếu các protocol ở mức Application không hiểu rõ cơ chế vận hành của TLS/SSL để sử dụng cho đúng cách? Đó là lúc lỗ hổng xuất hiện.
cái nghiên cứu mà mình đang làm và sắp công bố đúng y bóc cái quan sát ở trên. he he nên tiện tay "đào mồ" bài này lên lại để "khởi động" là vừa .
-m
|
|
|
@nightwishx: Với một website đưa tin tức, nghĩa là phần lớn request là "chỉ đọc" (read only), thì việc đầu tiên cần làm là caching. Dựng một hoặc một vài reverse proxy, dùng varnish hoặc Squid, cái gì cache được thì cache hết lại trên những con reverse proxy này. Hình như trên đây có một bài viết về Varnish thì phải. Bạn thử tìm và đọc. Nếu bạn không có kỹ năng sysadmin thì mình nghĩ nên đề nghị với lãnh đạo tìm thêm một người có kỹ năng này để hỗ trợ.
-m
|
|
|
|
|
|
|