Phát hiện các gói npm độc hại trên toàn bộ Red Hat Cloud Services
(github.com/RedHatInsights)- Vấn đề này hiện vẫn đang mở, và tại thời điểm bài viết được ghi lại chưa có người phụ trách, mốc phát hành, nhánh liên kết hay PR liên quan
- Đây được ghi nhận là một sự cố bảo mật khi phát hiện các phiên bản độc hại trong nhiều bản phát hành npm thuộc phạm vi
@redhat-cloud-services/ - Tài liệu tham khảo được đưa ra gồm bài phân tích của StepSecurity và kết quả tìm kiếm OSS Security Feed
- Danh sách ảnh hưởng đã được cập nhật bao gồm 32 gói, như
@redhat-cloud-services/chrome,frontend-components,rbac-client,types,vulnerabilities-clientvà các gói khác - Các phiên bản bị xâm phạm trong bảng hầu hết là 3 phiên bản cho mỗi gói, riêng
@redhat-cloud-services/vulnerabilities-clientchỉ gồm hai phiên bản2.1.9và2.1.11 - Tính theo toàn bộ bảng, có thể thống kê được 95 phiên bản bị xâm phạm; tiêu đề của một PR bên ngoài được nhắc riêng cũng chỉ ra
95 versions - Dòng
@redhat-cloud-services/frontend-components-*cùng nhiều gói*-clientcũng nằm trong danh sách, cho thấy đây không phải vấn đề của một gói đơn lẻ mà là sự cố phát hành trên toàn bộ cùng một scope - Trong phần bình luận, trước câu hỏi “What are these?”, có câu trả lời “all that module is pwned”, cho thấy mọi mục trong danh sách đều được hiểu là đã bị xâm phạm
- DanielRuf cho biết đã thêm sự việc này vào supply-chain-incidents
- Hoạt động trên GitHub cho thấy có nội dung tóm tắt tham chiếu đến issue này và một PR liên quan đến phát hiện, nhưng trong nội dung chính vẫn chưa có chẩn đoán, biện pháp giảm thiểu, việc gỡ bỏ hay phiên bản đã được sửa từ phía Red Hat
1 bình luận
Ý kiến Hacker News
Hy vọng vẫn ổn nếu mượn lại luồng này để nói về thiết lập cooldown. axios, tanstack, @redhat-cloud-services và nhiều cuộc tấn công chuỗi cung ứng npm gần đây có lẽ đã bị chặn nếu có cooldown
Nếu dùng Artifactory/Nexus thì rất có thể đã có sẵn, còn nếu chưa có thì cũng dễ cấu hình. Phần lớn các vụ xâm phạm npm hay PyPI đều bị gỡ xuống trong vòng vài giờ, nên chỉ cần bỏ qua các gói được phát hành chưa quá N ngày là đủ. 1 ngày cũng có tác dụng, 3 ngày là ổn, còn 7 ngày thì hơi quá nhưng vẫn hiệu quả
pnpm mới nhất đã bật cooldown 1 ngày theo mặc định: https://pnpm.io/supply-chain-security
Nếu muốn làm xong chỉ với một cú nhấp, có thể dùng https://depsguard.com. Đây là CLI thêm cooldown và các cấu hình được khuyến nghị cho npm, pnpm, yarn, bun, uv, dependabot, và tôi là người duy trì nó
Cũng có https://cooldowns.dev tập trung nhiều hơn vào cooldown, cùng các script hỗ trợ thiết lập cục bộ. Tất cả đều là mã nguồn mở/miễn phí
Nếu bạn biết tự chỉnh
~/.npmrcv.v. thì không thật sự cần, nhưng nếu quanh bạn có người chỉ cần bản sửa một cú nhấp thì nó có thể giúp tránh được đợt tấn công tiếp theoTuy vậy, khi cần vá một CVE nghiêm trọng mới xuất hiện thì phải có cách vượt qua cooldown, và mỗi công cụ đều có cách làm việc đó. Tôi không có số liệu chính xác cho vài tháng gần đây, nhưng ngay cả trong thời đại phát hiện lỗ hổng kiểu Mythos, rủi ro từ các cuộc tấn công chuỗi cung ứng phần mềm như phát hành phiên bản độc hại có vẻ vẫn lớn hơn so với CVE zero-day mới
~/.npmrcvà thêm một dòng, tôi vẫn cảm thấy nhóm thực sự cần bản sửa một cú nhấp là rất nhỏHoàn toàn có thể nói rằng “bản sửa bảo mật chỉ nên chứa sửa bảo mật và không được kèm tính năng khác”. Khi đó cả nhà nghiên cứu bảo mật lẫn công cụ đều sẽ dễ kiểm toán hơn
Có thể áp dụng cooldown cho các bản phát hành thông thường, còn với bản sửa bảo mật thì bỏ cooldown hoặc rút ngắn rất nhiều
Mô hình như Debian, với các máy chủ cực kỳ ổn định và có thể cấu hình unattended upgrades chỉ áp dụng cho bản sửa bảo mật, là điều đáng để tham khảo. Những bản phát hành gói mới kiểu này cũng dễ để các nhà nghiên cứu bảo mật kiểm toán hơn
Mỗi khi có những thảo luận kiểu này, thường có rất nhiều bình luận hành xử như thể kiểu tấn công này chỉ tồn tại ở npm, hoặc mỉa mai như thể chẳng hề có biện pháp nào được đưa ra, nhưng tôi thấy như vậy là không công bằng
Cũng có nhiều bình luận nhắc đến các tính năng hữu ích như delay line và pnpm đã được đưa vào để bảo vệ người dùng tiêu thụ gói
Phần ít được nhắc tới hơn là các công cụ phía người bảo trì gói. MFA cho phát hành: https://docs.npmjs.com/requiring-2fa-for-package-publishing-..., và trusted publishers đã được cung cấp từ khoảng 1 năm trước: https://docs.npmjs.com/trusted-publishers
Gần đây còn có staged publishing, kết hợp ưu điểm của cả hai tính năng: https://docs.npmjs.com/staged-publishing
Giờ đây có thể phát hành từ CI mà không cần thông tin xác thực tĩnh, đồng thời yêu cầu người bảo trì phê duyệt bằng MFA trước khi thực sự được công khai lên registry. Nếu muốn, còn có thể dùng GitHub Actions Environments protection để yêu cầu nhiều lượt phê duyệt hoặc độ trễ thời gian ở phía CI
Cộng đồng nên được khuyến khích áp dụng những cơ chế bảo vệ phát hành như vậy, nếu không thì vấn đề này sẽ còn tiếp diễn
Khi đó, các gói độc hại cũng sẽ nhận được ngôi sao xanh và khiến người dùng yên tâm rằng chúng “được build và ký kèm chứng thực nguồn gốc”
[1] https://lwn.net/Articles/1075742/
Việc đang có nỗ lực để ngăn chặn là rất đáng hoan nghênh, nhưng dù vậy nó vẫn tiếp tục xảy ra. Cái buồn cười là theo kiểu “lại nữa rồi”
Nhìn từ bên ngoài, phát triển web có một kiểu năng lượng như miền viễn Tây hỗn loạn. Có tính khả biến, kiểu động, các tiêu chuẩn và framework thay đổi liên tục, triển khai liên tục, CDN, chiến dịch A/B thời gian thực, rất nhiều phụ thuộc, và dữ liệu người dùng nhạy cảm rải khắp nhiều hạ tầng
Tôi không nói góc nhìn đó là chính xác, cũng không nghĩ thái độ “thấy chưa” là đúng, nhưng tôi hiểu nó xuất phát từ đâu
Đặc biệt, chẳng cái nào trong hai thứ đó có thể ngăn backdoor xz-utils lọt vào một bản phát hành gói. xz-utils vẫn là cột mốc chuẩn cho một vụ xâm phạm thượng nguồn tinh vi
Lỗi ở đây không phải là ta cần xác thực tốt hơn cái thượng nguồn mà ta đã tin, mà là ta không thể tin thượng nguồn như nguồn duy nhất của bảo mật. Thượng nguồn là một tập hợp hacker ít quan tâm đến kỹ nghệ phát hành vững chắc và cũng không làm tốt việc đó
Nhưng cũng có những người làm tốt. Giải pháp của thế giới Linux, và cũng là cách đã cứu chúng ta khỏi xz-utils, là tồn tại một tầng con người thứ hai để rà soát, kiểm toán, đóng gói và tùy biến phần mềm thượng nguồn do hacker tạo ra cho người dùng
Những người này có một góc nhìn khác, nhu cầu người dùng khác và tiêu chuẩn chất lượng khác, nên họ phát hiện được lỗi và ác ý mà thượng nguồn chưa sẵn sàng bắt ra
NPM, cargo, PyPI và các hệ sinh thái tương tự cứ nghĩ rằng họ có thể lách qua nhu cầu về lao động thủ công này, nhưng họ không thể. Hệ sinh thái NPM đặc biệt dễ gặp chuyện này hơn Python hay Rust trong các gói node vì ở đó có rất nhiều lập trình viên web đã quen với nhịp phát hành cực nhanh, yêu cầu tương thích lỏng lẻo và mức tái sử dụng cực đoan
Công ty tôi dùng yarn 4, và có một tùy chọn chặn cài đặt trong vài ngày đầu sau khi gói npm được phát hành. Có vẻ phần lớn các cuộc tấn công kiểu này đều bị phát hiện trong khoảng thời gian đó (1~3 ngày)
https://gist.github.com/mcollina/b294a6c39ee700d24073c0e5a4e...
Gói axios bị xâm phạm, và cả thông tin xác thực của tác giả cũng bị đánh cắp, nên mỗi lần cố sửa lại đều tiếp tục bị vô hiệu hóa: https://www.trendmicro.com/en_us/research/26/c/axios-npm-pac...
Tiện ích xz đã chứa backdoor trong 2 tháng: https://gigazine.net/gsc_news/en/20240403-timeline-of-xz-ope...
Một nhà nghiên cứu sinh viên đã tiếp quản quyền bảo trì các gói Python ctx và PHPass, phát tán thay đổi độc hại, và mất hơn 7 ngày mới phát hiện và khắc phục được: https://infosecwriteups.com/how-i-hacked-ctx-and-phpass-modu...
Kaspersky phát hiện nhiều gói PyPI đã bị lạm dụng trong hơn 1 năm: https://www.kaspersky.com/about/press-releases/kaspersky-unc...
Gói “LoftyLife” đã bị lạm dụng trong vài tháng: https://securelist.com/lofylife-malicious-npm-packages/10701...
Nếu cửa sổ tấn công chuyển thành 7 ngày, thì mọi cuộc tấn công mới kiểu này sẽ chỉ cần cài một quả bom hẹn giờ kích hoạt vào ngày thứ 8
pnpmcũng có cùng tính năng này, và từv11thì được bật mặc định: https://pnpm.io/settings#minimumreleaseageCó vài đề xuất. Cooldown phụ thuộc 1~2 ngày có vẻ rất hiệu quả mà không làm giảm khả năng vá CVE
Mọi nơi có chạy mã, như
npm install,npm test, đều nên chạy trong môi trường không có đặc quyền. Trên GitHub Actions, việc tách job build·test artifact khỏi job triển khai·ký tên v.v. là tương đối đơn giản. Nếu dùng AI, chỉ cần thêm skill/hướng dẫn để ép buộc mẫu nàyNếu dùng GitHub Actions thì cài zizmor bản mới nhất sẽ cải thiện đáng kể tư thế bảo mật
Biện pháp thứ hai giúp nó không còn có thể “lan truyền như sâu” nữa, và giảm bớt một phần lớn vấn đề hiện nay. Biện pháp thứ nhất giúp các công ty có thêm thời gian để phản ứng với cuộc tấn công. Một số vendor trong lĩnh vực này cũng đáng để đánh giá
Nghe khá buồn cười như một câu đùa, ngay sau khi vừa nói rằng nên trì hoãn các gói mới
Chạy một Maven proxy cục bộ, và mọi bản build đều thực hiện trong container. Python, npm, Go chỉ dùng kho công khai nên các build này cũng chạy trong container, nhưng không cần proxy cho kho
Đúng vào cùng ngày Red Hat và IBM công bố Project Lightwell để hỗ trợ phát hiện và khắc phục lỗ hổng chuỗi cung ứng
https://www.redhat.com/en/lightwell
Vài ngày trước tôi thấy bài rant thú vị này: https://github.com/uNetworking/uWebSockets.js/blob/master/mi...
Cũng có lý khi nói rằng cách đúng đắn là fork mọi dependency mình dùng, rồi khi cần thì rà soát và merge từ upstream trong lúc cài đặt từ kho của chính mình. Chỉ là có vẻ sẽ cực kỳ phiền phức
Cách này tốt để giảm hoặc loại bỏ sự phụ thuộc vào các nhà cung cấp dịch vụ lưu trữ dependency bên thứ ba, đưa dependency vào trong công cụ review code của mình, và về lâu dài bảo đảm build có thể tái lập
Packj(https://github.com/ossillate-inc/packj) phát hiện các dependency độc hại trên PyPI/NPM/Ruby/PHP... bằng phân tích hành vi. Nó quét các chỉ dấu xâm nhập như thực thi shell, dùng khóa SSH, giao tiếp mạng, sử dụng decode+eval bằng phân tích mã tĩnh + động. Nó cũng kiểm tra nhiều thuộc tính metadata để tìm các tác nhân độc hại như typosquatting
Khoảng một tuần trước tôi đã gỡ Node khỏi laptop và thấy rất dễ chịu
Ngay cả khi xui xẻo dính exploit, tôi cũng đang cố làm mọi thứ trong dev container hoặc sandbox khác để giảm bán kính ảnh hưởng. Kẻ tấn công có thể lấy token Claude, nhưng sẽ không dễ thoát khỏi container để lục lọi thư mục home của tôi
Cooldown và allowlist script cài đặt là lớp bổ sung rất tốt cho phòng thủ nhiều tầng, đặc biệt trong CI. Nhưng thứ cần thay đổi tận gốc, theo tôi, là mô hình quyền của hệ điều hành. Mặc định tin cậy phần mềm bên thứ ba với toàn bộ quyền người dùng giờ không còn hiệu quả nữa
Có lẽ nên gắn link bài công bố gốc
https://www.stepsecurity.io/blog/multiple-redhat-cloud-servi...
Giờ tôi có thói quen dùng cờ
--before=2026-05-30khi cài package. Nó buộc chọn các phiên bản được phát hành trước ngày chỉ định, và tôi thường chọn mốc khoảng 5 ngày trướchttps://docs.npmjs.com/cli/v11/using-npm/config#min-release-...
pnpmvà đặtminimumReleaseAgekhá rộng rãihttps://pnpm.io/settings#minimumreleaseage
May là từ v11 nó đã được bật mặc định
min-release-age=5vào.npmrcở thư mục gốc dự ánNPM bị hỏng ngay từ thiết kế, và hội chứng NIH lan tràn trong cộng đồng khiến ngay cả các biện pháp đơn giản cũng không làm nổi
Vì tiếp nhận quá nhiều package bên ngoài thay vì tự phát triển, các dự án npm có xu hướng có cây dependency lớn và phức tạp. Từ lâu đã có lời phàn nàn rằng các package như https://www.npmjs.com/package/is-windows tạo ra lỗ hổng tiềm ẩn và gánh nặng bảo trì, dù đoạn code tương đương quá dễ để tự viết
Nhưng rõ ràng đâu cần phải làm lại toàn bộ tính năng, chỉ cần làm phần mình cần là được
Hơn nữa, khi chỉ code một chức năng thì cũng không cần tạo abstraction hay interface hàm bổ sung. Vì thế sẽ rẻ hơn và có lẽ tích hợp cũng tốt hơn
Một ngộ nhận khác là nghĩ rằng như vậy sẽ tạo ra bug và lỗ hổng. Với lập trình viên kém thì có thể đúng, nhưng bạn sẽ tránh được cả một lớp lỗ hổng xuất hiện ở ranh giới tích hợp giữa hai thư viện vốn không được thiết kế để khớp chính xác với nhau. Trường hợp đó xảy ra khá thường xuyên