0
0
Lập trình
NM

Cuộc tấn công bảo mật mới trên npm và cách phòng tránh

Đăng vào 7 tháng trước

• 4 phút đọc

Cuộc tấn công bảo mật mới trên npm và cách phòng tránh

Số lượng cuộc tấn công và lỗ hổng xuất hiện hàng tuần trên npm đang trở nên vô cùng nghiêm trọng. Vấn đề này chỉ ngày càng gia tăng.

Tuần trước, chúng ta đã chứng kiến một cuộc tấn công rất nghiêm trọng, khi tài khoản của một người duy trì chính "Qix" bị xâm phạm. Hôm nay, một lần nữa, lại có một cuộc tấn công quan trọng khác nhằm vào thư viện tiny-color, có thể ảnh hưởng đến hơn 180 gói.

Và tất nhiên, loại tấn công phổ biến nhất chính là Tấn công Chuỗi Cung Ứng (Supply Chain Attack).

Tại sao lại có rủi ro cao trong hệ sinh thái JavaScript?

Rủi ro trong hệ sinh thái JavaScript luôn tồn tại, đặc biệt với số lượng lớn các phụ thuộc mà nguồn gốc của chúng không hoàn toàn được biết đến. Tuy nhiên, trong những tuần gần đây, chúng ta đã thấy ngày càng nhiều tin tức về các thư viện có triệu lượt tải về bị xâm phạm.

Vấn đề là trong JavaScript, chúng ta thường dựa vào hàng trăm gói, và chỉ cần một gói bị nhiễm là cuộc tấn công có thể đến với dự án của bạn. Bạn có thể đang sử dụng hàng chục gói mà không hề hay biết, vì chúng là các phụ thuộc của những phụ thuộc khác mà bạn đang sử dụng.

Tấn công Chuỗi Cung Ứng là gì?

Tấn công Chuỗi Cung Ứng giống như một con ngựa thành Troy hiện đại. Thay vì tấn công trực tiếp vào ứng dụng của bạn, chúng xâm nhập vào một thư viện phổ biến, sau đó thư viện này chạy bên trong ứng dụng của bạn với những mục tiêu khác nhau. Nó có thể tiếp cận các pipeline CI/CD, môi trường sản xuất và nhiều khả năng khác, gây thiệt hại hoặc làm lộ dữ liệu nhạy cảm.

Tại sao npm lại rủi ro đến vậy?

  • Phụ thuộc cao: một lần cài đặt npm có thể mang lại hàng chục thư viện gián tiếp mà bạn thậm chí không biết.
  • Tin tưởng quá mức: chúng ta mù quáng giả định rằng mọi thứ trên npm đều an toàn.
  • Tự động hóa nguy hiểm: nhiều pipeline CI/CD tự động cập nhật các phụ thuộc, mở ra cánh cửa cho các cuộc tấn công lan rộng.

Cách phòng tránh?

1. Khóa phiên bản trong package.json

Biểu tượng caret "^" là kẻ thù tồi tệ nhất của bạn. Tốt hơn là cập nhật các phụ thuộc một cách có ý thức hơn là để bất kỳ phiên bản “Minor” hoặc “Patch” nào tự động cài đặt.

Theo quy tắc Semantic Versioning, chúng ta có MAJOR.MINOR.PATCH:

json Copy
"library-example": "^6.1.0" // cài đặt các phiên bản Minor và Patch

Với caret, bất kỳ phiên bản nào như 6.1.1, 6.1.2 hoặc 6.2.0 sẽ được cài đặt vào dự án của bạn. Nếu một trong số các phiên bản đó bị xâm phạm, bạn sẽ sử dụng nó mà không hề biết.

json Copy
"library-example": "6.1.0" // chỉ cài đặt phiên bản cụ thể đó

2. Kiểm tra các phụ thuộc của bạn

Đừng rơi vào cái bẫy "cài đặt và quên". Các phụ thuộc phải được xem xét định kỳ, vì ngay cả những thư viện rất phổ biến cũng có thể bị xâm phạm.

Hãy kiểm tra những gì bạn cài đặt và sử dụng các công cụ như:

  • npm audit
  • OWASP Dependency-Check

Những công cụ này phát hiện các lỗ hổng đã biết và giúp bạn ưu tiên các bản vá bảo mật.

Ngoài ra, việc kiểm tra trạng thái của một thư viện trước khi cài đặt cũng là thói quen tốt: lần cuối cùng nó được cập nhật là khi nào? có hoạt động nào trên GitHub không? nó có bao nhiêu người duy trì?

Một thư viện bị bỏ rơi hoặc chỉ có một người duy trì sẽ dễ bị tấn công hơn.

3. Giảm thiểu các phụ thuộc

Mỗi thư viện mới mà bạn thêm vào là một điểm xâm nhập tiềm năng vào ứng dụng của bạn. Nhiều khi, chúng ta cài đặt một gói cho những tác vụ rất đơn giản, thường thì tốt hơn là viết 20 dòng mã của riêng bạn thay vì mang thêm một phụ thuộc không rõ ràng nữa.

Ít phụ thuộc hơn = ít bề mặt tấn công hơn, ít cập nhật cần theo dõi và một dự án dễ dự đoán hơn. Không phải mọi thứ đều phải đến từ npm.

Kết luận

Trong npm, sự tin tưởng được giao phó một cách quá dễ dàng. Hãy cẩn thận với những gì bạn đưa vào dự án của mình, bảo mật của bạn phụ thuộc vào nó.

Thực hành tốt nhất

  • Luôn khóa phiên bản phụ thuộc.
  • Thường xuyên kiểm tra và cập nhật phụ thuộc.
  • Đánh giá kỹ lưỡng các thư viện trước khi tích hợp.

Cạm bẫy phổ biến

  • Tin tưởng vào tất cả các gói trên npm mà không kiểm tra.
  • Cài đặt quá nhiều thư viện không cần thiết.

Mẹo hiệu suất

  • Tối ưu hóa các gói sử dụng trong dự án của bạn để giảm thiểu tải.

Giải quyết sự cố

  • Nếu bạn phát hiện ra một lỗ hổng, hãy kiểm tra các phụ thuộc của bạn ngay lập tức và cập nhật chúng.

Câu hỏi thường gặp (FAQ)

  1. Tôi nên làm gì nếu phát hiện một thư viện bị xâm phạm?
    • Ngay lập tức thay thế hoặc xóa thư viện đó và tìm một giải pháp thay thế an toàn hơn.
  2. Có công cụ nào giúp tôi quản lý phụ thuộc không?
    • Có, bạn có thể sử dụng npm audit hoặc các công cụ như Snyk để theo dõi và phát hiện lỗ hổng.
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào