Làm an toàn sản phẩm (product security) là làm gì?
Đây là công việc hàng ngày của tôi. Ở TetCon có người hỏi và gần đây cũng có vài nơi hỏi, nên tôi viết lại đây để tiện tham chiếu về sau.
Ở Google tôi là một trong 4 nhóm trưởng của một nhóm hơn 20 kỹ sư chịu trách nhiệm về an toàn sản phẩm. Hầu hết sản phẩm của hãng đều do người trong nhóm hoặc từng là người trong nhóm chịu trách nhiệm. Sản phẩm lớn có người chuyên trách, sản phẩm nhỏ hơn chúng tôi thay phiên, ai thích gì làm nấy.
Chúng tôi đề nghị (nhưng không bắt buộc) nhóm phát triển sản phẩm thông báo kế hoạch của họ càng sớm càng tốt. Có nhóm nói chuyện với bọn tôi ngay khi chưa viết bất kỳ một dòng mã nào, nhưng cũng có nhóm đợi đến ngày phát hành. Khi tôi làm ở Matasano, khách hàng thường liên hệ trước khi phát hành sản phẩm vài tháng.
Nên bắt đầu thẩm định ATTT càng sớm càng tốt. Sửa lỗi rẻ hơn nhiều khi sản phẩm còn nằm trên bàn thiết kế so với khi sản phẩm đã nên hình nên dạng. Khi xây một căn nhà, sửa mống sẽ tốn kém và có khi không thực hiện được nếu nhà đã xây đến tầng thứ 3.
Khi bắt đầu dự án, tôi đọc tài liệu về sản phẩm và, nếu cần, cài đặt một phiên bản thử nghiệm. Ở Google tôi có thể nói chuyện trực tiếp với đội phát triển sản phẩm. Ở Matasano khách hàng thường cử ra một đại diện để trả lời thắc mắc.
Tôi chia các dự án thẩm định ATTT thành các nhóm như sau, căn cứ theo mục tiêu:
1/ Tìm tất cả các lỗ hổng có thể có (vulnerability assessment).
2/ Chọn một mục tiêu, tìm mọi cách xâm nhập vào hệ thống để đạt được mục tiêu đó (penetration testing): ví dụ như khách hàng có website Internet Banking, lo ngại bị trộm tiền; tôi sẽ tìm lỗ hổng để trộm tiền từ tài khoản của người khác hoặc tự tăng tiền trong tài khoản của mình lên.
Khách hàng có thể cung cấp thiết kế hoặc mã nguồn -- làm vậy sẽ giúp đánh giá toàn diện hơn -- nhưng nếu lo ngại họ chỉ cung cấp file thực thi của chương trình, địa chỉ URL, hoặc một dãy địa chỉ IP.
Đối với mỗi loại dự án chúng ta có thể chọn những điểm bắt đầu như sau:
* Xâm nhập từ Internet: tôi sẽ tiến hành công việc như một người dùng bình thường.
* Xâm nhập từ hệ thống nội bộ: tôi sẽ tiến hành công việc như nhân viên của công ty với một số quyền hạn nhất định. Ví dụ như đối với hệ thống payment, nhân viên nội bộ (ví dụ như lập trình viên, sysadmin, v.v.) không nên có quyền tác động vào thông tin giao dịch hoặc tài chính, nên tôi sẽ bắt đầu với vai trò lập trình viên của sản phẩm đó.
Khi báo cáo kết quả, tôi cung cấp một tài liệu mô tả chi tiết vấn đề, lỗ hổng đã phát hiện, mã khai thác nếu có thể và kiến nghị sửa chữa. Các dự án ở Google tôi làm việc với nhóm phát triển sản phẩm để đảm bảo các vấn đề đã phát hiện được khắc phục và không lập lại trong các phiên bản kế tiếp.
Phần lớn thời gian tôi đọc tài liệu thiết kế, vọc sản phẩm, kiểm tra mã nguồn, nói chung là "tra tấn" phần mềm để chúng phun ra lỗi. Kinh nghiệm cho tôi biết chỗ nào quan trọng cần phải xem kỹ, chỗ nào có thể có những dạng lỗi gì, v.v. Đối với sản phẩm phức tạp, tôi mường tượng trong đầu "life of a request" -- một yêu cầu từ phía người dùng được hệ thống xử lý như thế nào -- từ đó xác định những nơi có nguy cơ.
Thông thường tôi mất 20-40 giờ để làm xong một sản phẩm phức tạp, đa số sản phẩm chỉ cần 2-3 giờ. Hồi mới vô nghề tôi mất nhiều thời gian hơn, bây giờ tôi biết chỗ nào nên coi, chỗ nào có thể bỏ qua. Matasano tính tiền khách hàng theo giờ, tôi không biết chính xác nhưng tôi đoán mỗi giờ cũng phải \$200-\$400. Tôi biết có nơi tính \$500/giờ. Có vài công ty ở Việt Nam hỏi tôi có làm tư vấn không, tôi báo giá, họ biến mất luôn, không bao giờ trả lời o_O.
--
Tôi dành 50% thời gian để phá hoại phần mềm như vừa kể, phần thời gian còn lại tôi xây dựng phần mềm mới. Phá phần mềm giúp tôi có thêm kinh nghiệm làm phần mềm an toàn. Tôi lãnh đạo một nhóm nhỏ chuyên đánh giá, thiết kế và lập trình các giải pháp mật mã cho các nhóm làm sản phẩm. Ví dụ như YouTube cần một cách mã hóa video nhanh, bọn tôi thiết kế và lập trình giao thức cho nhóm YouTube. Hay như công ty cần một giải thuật băm mật khẩu (password hashing algorithm), bọn tôi thiết kế và lập trình một thuật toán mới, đáp ứng yêu cầu hiệu năng mà nhóm làm sản phẩm đặt ra. Có nhiều ví dụ khác nữa, nhưng đại loại là ở đâu cần mật mã ở đó có bọn tôi.
Ở Google tôi là một trong 4 nhóm trưởng của một nhóm hơn 20 kỹ sư chịu trách nhiệm về an toàn sản phẩm. Hầu hết sản phẩm của hãng đều do người trong nhóm hoặc từng là người trong nhóm chịu trách nhiệm. Sản phẩm lớn có người chuyên trách, sản phẩm nhỏ hơn chúng tôi thay phiên, ai thích gì làm nấy.
Chúng tôi đề nghị (nhưng không bắt buộc) nhóm phát triển sản phẩm thông báo kế hoạch của họ càng sớm càng tốt. Có nhóm nói chuyện với bọn tôi ngay khi chưa viết bất kỳ một dòng mã nào, nhưng cũng có nhóm đợi đến ngày phát hành. Khi tôi làm ở Matasano, khách hàng thường liên hệ trước khi phát hành sản phẩm vài tháng.
Nên bắt đầu thẩm định ATTT càng sớm càng tốt. Sửa lỗi rẻ hơn nhiều khi sản phẩm còn nằm trên bàn thiết kế so với khi sản phẩm đã nên hình nên dạng. Khi xây một căn nhà, sửa mống sẽ tốn kém và có khi không thực hiện được nếu nhà đã xây đến tầng thứ 3.
Khi bắt đầu dự án, tôi đọc tài liệu về sản phẩm và, nếu cần, cài đặt một phiên bản thử nghiệm. Ở Google tôi có thể nói chuyện trực tiếp với đội phát triển sản phẩm. Ở Matasano khách hàng thường cử ra một đại diện để trả lời thắc mắc.
Tôi chia các dự án thẩm định ATTT thành các nhóm như sau, căn cứ theo mục tiêu:
1/ Tìm tất cả các lỗ hổng có thể có (vulnerability assessment).
2/ Chọn một mục tiêu, tìm mọi cách xâm nhập vào hệ thống để đạt được mục tiêu đó (penetration testing): ví dụ như khách hàng có website Internet Banking, lo ngại bị trộm tiền; tôi sẽ tìm lỗ hổng để trộm tiền từ tài khoản của người khác hoặc tự tăng tiền trong tài khoản của mình lên.
Khách hàng có thể cung cấp thiết kế hoặc mã nguồn -- làm vậy sẽ giúp đánh giá toàn diện hơn -- nhưng nếu lo ngại họ chỉ cung cấp file thực thi của chương trình, địa chỉ URL, hoặc một dãy địa chỉ IP.
Đối với mỗi loại dự án chúng ta có thể chọn những điểm bắt đầu như sau:
* Xâm nhập từ Internet: tôi sẽ tiến hành công việc như một người dùng bình thường.
* Xâm nhập từ hệ thống nội bộ: tôi sẽ tiến hành công việc như nhân viên của công ty với một số quyền hạn nhất định. Ví dụ như đối với hệ thống payment, nhân viên nội bộ (ví dụ như lập trình viên, sysadmin, v.v.) không nên có quyền tác động vào thông tin giao dịch hoặc tài chính, nên tôi sẽ bắt đầu với vai trò lập trình viên của sản phẩm đó.
Khi báo cáo kết quả, tôi cung cấp một tài liệu mô tả chi tiết vấn đề, lỗ hổng đã phát hiện, mã khai thác nếu có thể và kiến nghị sửa chữa. Các dự án ở Google tôi làm việc với nhóm phát triển sản phẩm để đảm bảo các vấn đề đã phát hiện được khắc phục và không lập lại trong các phiên bản kế tiếp.
Phần lớn thời gian tôi đọc tài liệu thiết kế, vọc sản phẩm, kiểm tra mã nguồn, nói chung là "tra tấn" phần mềm để chúng phun ra lỗi. Kinh nghiệm cho tôi biết chỗ nào quan trọng cần phải xem kỹ, chỗ nào có thể có những dạng lỗi gì, v.v. Đối với sản phẩm phức tạp, tôi mường tượng trong đầu "life of a request" -- một yêu cầu từ phía người dùng được hệ thống xử lý như thế nào -- từ đó xác định những nơi có nguy cơ.
Thông thường tôi mất 20-40 giờ để làm xong một sản phẩm phức tạp, đa số sản phẩm chỉ cần 2-3 giờ. Hồi mới vô nghề tôi mất nhiều thời gian hơn, bây giờ tôi biết chỗ nào nên coi, chỗ nào có thể bỏ qua. Matasano tính tiền khách hàng theo giờ, tôi không biết chính xác nhưng tôi đoán mỗi giờ cũng phải \$200-\$400. Tôi biết có nơi tính \$500/giờ. Có vài công ty ở Việt Nam hỏi tôi có làm tư vấn không, tôi báo giá, họ biến mất luôn, không bao giờ trả lời o_O.
--
Tôi dành 50% thời gian để phá hoại phần mềm như vừa kể, phần thời gian còn lại tôi xây dựng phần mềm mới. Phá phần mềm giúp tôi có thêm kinh nghiệm làm phần mềm an toàn. Tôi lãnh đạo một nhóm nhỏ chuyên đánh giá, thiết kế và lập trình các giải pháp mật mã cho các nhóm làm sản phẩm. Ví dụ như YouTube cần một cách mã hóa video nhanh, bọn tôi thiết kế và lập trình giao thức cho nhóm YouTube. Hay như công ty cần một giải thuật băm mật khẩu (password hashing algorithm), bọn tôi thiết kế và lập trình một thuật toán mới, đáp ứng yêu cầu hiệu năng mà nhóm làm sản phẩm đặt ra. Có nhiều ví dụ khác nữa, nhưng đại loại là ở đâu cần mật mã ở đó có bọn tôi.
Comments
Anh có tài liệu nào về quy trình an toàn sản phẩm khi kết nối từ ứng dụng của mình ra các cổng của các đơn vị bên ngoài không ạ?