Vui lòng làm cho ngôn ngữ của bạn có thể phân tích / kiểm toán được cho những người bảo mật máy tính.
Những người bảo mật cần có khả năng tìm thấy các lỗ hổng trong một chương trình trước khi nó xuất xưởng. Lý tưởng nhất, chúng tôi được gọi sớm và có thể nhận xét về codebase khi nó phát triển, nhưng thường thì không.
Khi một phiên bản mới của ngôn ngữ hoặc thư viện cốt lõi xuất hiện, những thứ trước đây an toàn có thể không còn là:
- thư viện có thể trở nên mạnh hơn: ví dụ: thư viện URL hiện hỗ trợ
javascript:
- có thể có những cách mới để chuyển đổi chuỗi hoặc byte thành mã: ví dụ
eval
hoặc thư viện giải nén
- kỹ thuật phản xạ ngôn ngữ có thể trở nên mạnh mẽ hơn: ví dụ: phơi bày các biến cục bộ
Bất kỳ thay đổi nào trong số này có thể làm tăng số lượng thẩm quyền có thể sử dụng được mà chương trình có, nhưng vì số lượng quyền hạn mà chương trình sử dụng (khi giao dịch với khách hàng không độc hại) đã không thay đổi, dân gian bảo mật khó có thể tìm ra mà không cần tăng cường Kiểm toán lại.
Vì vậy, hãy nghĩ về chúng tôi khi thiết kế và phiên bản ngôn ngữ. Dưới đây là một vài lời khuyên:
Xác định một vài nguyên thủy mà một chương trình có thể được phân tách thành.
HTML5 đặc biệt tệ theo cách này. Họ rõ ràng đã suy nghĩ rất nhiều về bảo mật và có một số người rất thông minh, nhưng thay vì chỉ định các yếu tố chương trình mới như <video>
về mặt cũ, hoặc tạo ra một sự trừu tượng chung mà cả hai mới <video>
và cũ <img>
đều có thể được chỉ định về mặt, <video>
vẫn chưa được chỉ định một yếu tố chương trình một lần khác với hậu quả bảo mật của riêng nó.
Làm cho ngôn ngữ của bạn có thể tuân theo phân tích tĩnh (ngay cả khi không được nhập tĩnh).
Dân gian bảo mật thường sử dụng phân tích tĩnh để tìm các mẫu và thử và loại trừ các phần của chương trình để chúng có thể tập trung vào các bit thực sự khó khăn.
Rõ ràng định danh nào là biến cục bộ và biến nào không.
Ví dụ: không mắc lỗi tương tự như các phiên bản JavaScript cũ khiến bạn không thể biết liệu có phải x
là tham chiếu biến cục bộ ở bên dưới hay không (theo cách đọc theo nghĩa đen của phiên bản cũ của thông số kỹ thuật):
if (Math.random() > 0.5) {
Object.prototype.x = 0;
}
function f() {
var x = 1;
(function () {
alert(x); // Might alert 0, might alert 1.
})();
}
Cho phép bảo mật có thể phân tách
Rất nhiều hệ thống bảo mật được thiết kế xung quanh một hạt nhân bảo mật bảo tồn các thuộc tính bảo mật, để dân bảo mật có thể tập trung nỗ lực phân tích một lượng nhỏ mã và giải phóng hầu hết các lập trình viên khỏi phải đối phó với dân gian bảo mật {gây phiền nhiễu, hoang tưởng, hoang tưởng} .
Có thể viết một kernel như vậy trong ngôn ngữ của bạn. Nếu một trong các thuộc tính bảo mật của ngôn ngữ của bạn, đó chỉ là một tập hợp con URL nhất định sẽ được tìm nạp, các nhà văn hạt nhân có thể làm gì đó để kênh tất cả URL tìm nạp thông qua mã của họ không? Hoặc có thể kiểm tra bản dựng tĩnh (như xem nhập khẩu) phục vụ cùng chức năng.
Một số ngôn ngữ như Drameak sử dụng mô hình khả năng đối tượng. Đó là cách tuyệt vời và là một cách tuyệt vời để có được bảo mật có thể phân tách.
Nhưng nếu bạn không thể làm điều đó, làm cho biểu đồ mô-đun trở thành một tạo tác có thể phân tích tĩnh có thể mang lại cho bạn khá nhiều lợi ích. Nếu tôi có thể chứng minh rằng một mô-đun không thể tiếp cận mô-đun I / O của tệp (ngoại trừ bằng cách gọi mã trong mô-đun trong TCB), thì tôi có thể loại trừ toàn bộ các lớp sự cố từ mô-đun đó.
Giới hạn thẩm quyền của các ngôn ngữ kịch bản nhúng
Rất nhiều hệ thống hữu ích được tổ chức như một lõi tĩnh khởi động rất nhiều mã được viết bằng các ngôn ngữ động (thậm chí là chức năng).
Và nhúng các ngôn ngữ kịch bản có thể làm cho một hệ thống mở rộng hơn nhiều.
Nhưng một ngôn ngữ kịch bản không nên có toàn quyền của VM.
Nếu bạn chọn cho phép các ngôn ngữ kịch bản nhúng, hãy giúp người xâm nhập dễ dàng giới hạn những gì họ có thể làm. Một mô hình khả năng đối tượng (xem bình luận về Drameak ở trên) rất phù hợp ở đây; Vì vậy, khi đánh giá mã bằng ngôn ngữ kịch bản, người gọi nên chuyển mã để thực thi và tất cả các biến toàn cục cho mã đó.
Coi eval
như một ngôn ngữ nhúng chính nó như một ngôn ngữ kịch bản
Nếu ngôn ngữ của bạn có thể gọi trình biên dịch riêng của nó để biến một chuỗi thành mã, thì hãy cho phép nó được đóng hộp cát giống như bất kỳ ngôn ngữ kịch bản nhúng nào.
Sử dụng mô hình tương tranh đơn giản
Chúng tôi, những người bảo mật không muốn phải lo lắng về các điều kiện chủng tộc khi cố gắng tìm hiểu xem một tài sản bảo mật có được duy trì hay không.
Vui lòng xem xét các lựa chọn thay thế cho luồng trước khi giải quyết các luồng như một tùy chọn mặc định gần như không thể bảo mật.
Một điều đơn giản là sự tương tranh của vòng lặp sự kiện giống như được tìm thấy trong E, Verilog và JavaScript.
Đừng khuyến khích trích dẫn nhầm lẫn
Một số ngôn ngữ là ngôn ngữ keo và cuối cùng chúng xử lý các chuỗi bằng nhiều ngôn ngữ khác nhau.
Ví dụ: JavaScript thường tổng hợp các chuỗi HTML, CSS, XML, JSON và thậm chí là JavaScript. Các lập trình viên rất khó nhớ để mã hóa chính xác các chuỗi văn bản đơn giản khi kết hợp chúng để tạo các chuỗi trong các ngôn ngữ khác, vì vậy, các chương trình JS, không có gì đáng ngạc nhiên, có tất cả các loại trích dẫn các vấn đề nhầm lẫn: XSS là tồi tệ nhất.
Nếu bạn muốn bao gồm các tính năng thành phần chuỗi, hãy cố gắng giảm gánh nặng bảo mật của lập trình viên. DSL, macro vệ sinh và ngôn ngữ tạo khuôn mẫu nhúng có thể là một cách tuyệt vời để làm điều này bằng cách chuyển gánh nặng để thoát đúng cách vào thư viện hoặc nhà phát triển ngôn ngữ và tránh xa nhà phát triển cuối.