惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

PCI Perspectives
PCI Perspectives
Apple Machine Learning Research
Apple Machine Learning Research
Recent Announcements
Recent Announcements
量子位
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Recorded Future
Recorded Future
P
Privacy International News Feed
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
C
Check Point Blog
O
OpenAI News
N
Netflix TechBlog - Medium
U
Unit 42
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
宝玉的分享
宝玉的分享
F
Full Disclosure
Know Your Adversary
Know Your Adversary
GbyAI
GbyAI
W
WeLiveSecurity
Engineering at Meta
Engineering at Meta
Scott Helme
Scott Helme
云风的 BLOG
云风的 BLOG
I
InfoQ
D
Docker
N
News | PayPal Newsroom
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
T
Tor Project blog
The GitHub Blog
The GitHub Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
ThreatConnect
人人都是产品经理
人人都是产品经理
S
Securelist
G
Google Developers Blog
Martin Fowler
Martin Fowler
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
P
Privacy & Cybersecurity Law Blog
L
Lohrmann on Cybersecurity
博客园 - 【当耐特】
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog

Recent Commits to openclaw:main

docs: expand meeting notes docs · openclaw/openclaw@a7e0fa0 fix(cli): validate tasks audit limit (#84901) · openclaw/openclaw@44d470f fix(twitch): preserve newer message handler during cleanup (#85425) · openclaw/openclaw@71ddc01 fix(ci): require live docker credentials by resource · openclaw/openclaw@1e21121 fix(diagnostics): drop snake case otel ids (#72645) · openclaw/openclaw@e0bafc5 fix(ci): clear signal and docs guard blockers (#85693) · openclaw/openclaw@3a1d4dd fix(ci): require factory auth for droid live docker · openclaw/openclaw@cc6c372 fix: honor disabled synthetic auth lookup · openclaw/openclaw@a4a1abb fix(scripts): repair live docker auth shellcheck · openclaw/openclaw@4e34ac4 fix(docker): avoid printing gateway token · openclaw/openclaw@5db773f fix(cli): keep logs follow on live gateway state · openclaw/openclaw@6e3b318 fix(e2e): prefer x64 MinGit on Windows · openclaw/openclaw@15d9134 feat: add meeting notes plugin docs: update changelog for memory artifacts (#85060) (thanks @brokema… · openclaw/openclaw@9e55383 fix(memory-lancedb): expose public memory artifacts · openclaw/openclaw@aac1abe fix(memory): preserve sidecar capability hooks · openclaw/openclaw@e6288ca fix(e2e): scrub Windows update config on PowerShell 5.1 · openclaw/openclaw@6657b49 docs: absorb documentation PR sweep · openclaw/openclaw@2c536a8 fix(agents): stabilize Linux fallback tests · openclaw/openclaw@6b04170 fix(codex): preserve native web search action metadata (#85378) · openclaw/openclaw@bcf756c test: refresh Codex prompt snapshots · openclaw/openclaw@492d656 docs: absorb hook and subagent guidance PRs fix(agents): audit tool policy blocks (#85673) · openclaw/openclaw@09dd051 ci: fix plugin npm bundled dependency install · openclaw/openclaw@d485464 feat(diagnostics): classify skill and tool usage (#80370) docs(skills): clarify control ui recording proof (#85568) · openclaw/openclaw@0b476b9 test(agents): repair main failure fixtures · openclaw/openclaw@c29967b feat(diagnostics): trace gateway secret preparation (#83019) · openclaw/openclaw@4f0c902 fix(diagnostics): harden observability exports and smokes (#85371) · openclaw/openclaw@7f05be0 fix(stepfun): drop stale auth choice metadata · openclaw/openclaw@0b2ab6c test(e2e): sample kitchen sink RSS on Windows · openclaw/openclaw@73c1e37 test(plugins): fail gauntlet on load diagnostics fix(build): preserve tsdown heap floor · openclaw/openclaw@9ff1a43 fix(tools): honor config apiKey in media tool preflight (#85570) · openclaw/openclaw@31c269f fix(e2e): support macOS script wrappers fix(ci): scope changed shrinkwrap checks · openclaw/openclaw@743fd4c chore(ui): refresh fa control ui locale chore(ui): refresh nl control ui locale · openclaw/openclaw@908464b chore(ui): refresh vi control ui locale · openclaw/openclaw@62b75f4 chore(ui): refresh th control ui locale · openclaw/openclaw@fc4ba31 chore(ui): refresh id control ui locale · openclaw/openclaw@5b1bdd1 chore(ui): refresh pl control ui locale · openclaw/openclaw@534d4b1 chore(ui): refresh uk control ui locale · openclaw/openclaw@055c3bd chore(ui): refresh ar control ui locale · openclaw/openclaw@89c5a68 chore(ui): refresh it control ui locale · openclaw/openclaw@44ca805 chore(ui): refresh tr control ui locale chore(ui): refresh fr control ui locale · openclaw/openclaw@2240b0e chore(ui): refresh ko control ui locale · openclaw/openclaw@5fa250b chore(ui): refresh ja-JP control ui locale · openclaw/openclaw@f4ea401 chore(ui): refresh es control ui locale · openclaw/openclaw@751dde0 chore(ui): refresh de control ui locale · openclaw/openclaw@72a9b5b chore(ui): refresh pt-BR control ui locale · openclaw/openclaw@501b6e0 chore(ui): refresh zh-CN control ui locale chore(ui): refresh zh-TW control ui locale · openclaw/openclaw@88dee79 Add Slack approval QA checkpoints (#85141) fix(agents): mirror internal ui message tool replies (#85564) perf(whatsapp): narrow runtime setter entry (#85589) · openclaw/openclaw@463929d fix: smooth chat focus mode layout · openclaw/openclaw@bb5abef Fix Telegram missing harness spool poison (#85605) · openclaw/openclaw@b745082 fix(session): surface previous-transcript archive failures on /new ro… · openclaw/openclaw@679a46d Policy: add agent workspace conformance checks (#85096) · openclaw/openclaw@a94f344 fix(installer): fail failed Windows git builds · openclaw/openclaw@2edd6e2 fix(codex): honor node exec policy for native surfaces (#85534) · openclaw/openclaw@e0405ec fix(qa-lab): stabilize codex runtime parity fixtures fix(github): preserve sufficient proof against negative relabel (#85567) · openclaw/openclaw@6b52dff docs: add changelog for context pressure preflight · openclaw/openclaw@5ca734f Fix context pressure preflight for tool-heavy sessions (#85541) · openclaw/openclaw@c08400e fix(doctor): classify codex asset notice as info (#85119) · openclaw/openclaw@959b935 fix(ui): keep chat picker search current (#85547) fix: preserve message-tool delivery evidence · openclaw/openclaw@f022b05 fix(codex): add API key paste auth (#85533) fix: satisfy openai video test typecheck · openclaw/openclaw@743caed fix: route openai video edits to edits endpoint · openclaw/openclaw@6c3fcb8 fix(qmd): normalize direct file collection paths (#65212) · openclaw/openclaw@227b4bf fix(testbox): preserve clean sparse checkouts · openclaw/openclaw@58e9628 fix(ui): run ui script through junction paths (#85525) · openclaw/openclaw@ad19dd8 docs: fix troubleshooting logs link (#85545) · openclaw/openclaw@60582b6 Revert chat session picker inline search (#85527) · openclaw/openclaw@d69bcfd fix: preserve guarded video operation cleanup · openclaw/openclaw@ed7d99a fix: honor openai video provider request network policy fix: retry guarded video downloads · openclaw/openclaw@efbf9f3 fix: thread openai video request policy · openclaw/openclaw@31b5145 docs(changelog): note heartbeat message-tool fix · openclaw/openclaw@c127334 fix: use fs-safe trash for agent delete (#84394) · openclaw/openclaw@951bbe6 Fix heartbeat message-tool delivery policy (#85357) · openclaw/openclaw@bd9c78f Scope config preflight note suppression (#84439) · openclaw/openclaw@91d85e7 fix(cron): document best-effort edit delivery mode (#84526) fix(dreaming): open report cards from memory palace (#85144) · openclaw/openclaw@2e15830 fix(openai-codex): preserve image input capability (#85393) · openclaw/openclaw@49ce171 fix(codex): stabilize heartbeat dynamic tool schema (#84681) · openclaw/openclaw@c52daa4 docs: absorb small documentation PRs · openclaw/openclaw@658be7f fix(scripts): preserve bws resolver parse errors (#85528) · openclaw/openclaw@13a4c57 fix(telegram): honor outbound media max bytes (#83478) · openclaw/openclaw@f2d4f93 fix(skills): restore executable bit on bundled whisper script + relea… · openclaw/openclaw@1dd3b52 fix(google): print Gemini OAuth URL before browser launch (#71469) · openclaw/openclaw@2d5bda9 docs: absorb contributor documentation fixes docs: tighten landable bug sweep gates · openclaw/openclaw@8f86383 fix: reuse provider auth lookup facts (#85499) · openclaw/openclaw@299ed80 fix: keep session picker focus separate · openclaw/openclaw@7e12370 feat: start onboarding for fresh CLI installs (#85519) · openclaw/openclaw@464ffc1
fix(status): bound deep docker audit probes (#85476) · openclaw/openclaw@f7c05dc
giodl73-repo · 2026-05-23 · via Recent Commits to openclaw:main

@@ -39,6 +39,8 @@ type ExecDockerRawFn = (

3939

opts?: { allowFailure?: boolean; input?: Buffer | string; signal?: AbortSignal },

4040

) => Promise<import("../agents/sandbox/docker.js").ExecDockerRawResult>;

414142+

const DEFAULT_SANDBOX_BROWSER_DOCKER_PROBE_TIMEOUT_MS = 5000;

43+4244

type CodeSafetySummaryCache = Map<string, Promise<unknown>>;

4345

let skillsModulePromise: Promise<typeof import("../agents/skills.js")> | undefined;

4446

let configModulePromise: Promise<typeof import("../config/config.js")> | undefined;

@@ -274,13 +276,63 @@ function normalizeDockerLabelValue(raw: string | undefined): string | null {

274276

return trimmed;

275277

}

276278277-

async function listSandboxBrowserContainers(

278-

execDockerRawFn: ExecDockerRawFn,

279-

): Promise<string[] | null> {

279+

class DockerProbeTimeoutError extends Error {

280+

constructor(timeoutMs: number) {

281+

super(`Docker probe timed out after ${timeoutMs}ms`);

282+

this.name = "DockerProbeTimeoutError";

283+

}

284+

}

285+286+

function normalizeDockerProbeTimeoutMs(timeoutMs: number | undefined): number {

287+

if (Number.isFinite(timeoutMs) && timeoutMs !== undefined) {

288+

return Math.max(250, Math.floor(timeoutMs));

289+

}

290+

return DEFAULT_SANDBOX_BROWSER_DOCKER_PROBE_TIMEOUT_MS;

291+

}

292+293+

async function withDockerProbeTimeout<T>(

294+

timeoutMs: number,

295+

run: (signal: AbortSignal) => Promise<T>,

296+

): Promise<T> {

297+

const controller = new AbortController();

298+

let timeout: NodeJS.Timeout | undefined;

299+

let timedOut = false;

300+

const timeoutPromise = new Promise<never>((_, reject) => {

301+

timeout = setTimeout(() => {

302+

timedOut = true;

303+

controller.abort();

304+

reject(new DockerProbeTimeoutError(timeoutMs));

305+

}, timeoutMs);

306+

});

307+

try {

308+

return await Promise.race([run(controller.signal), timeoutPromise]);

309+

} catch (err) {

310+

if (timedOut || controller.signal.aborted) {

311+

throw new DockerProbeTimeoutError(timeoutMs);

312+

}

313+

throw err;

314+

} finally {

315+

if (timeout) {

316+

clearTimeout(timeout);

317+

}

318+

}

319+

}

320+321+

function isDockerProbeTimeoutError(error: unknown): boolean {

322+

return error instanceof DockerProbeTimeoutError;

323+

}

324+325+

async function listSandboxBrowserContainers(params: {

326+

execDockerRawFn: ExecDockerRawFn;

327+

timeoutMs: number;

328+

onTimeout?: () => void;

329+

}): Promise<string[] | null> {

280330

try {

281-

const result = await execDockerRawFn(

282-

["ps", "-a", "--filter", "label=openclaw.sandboxBrowser=1", "--format", "{{.Names}}"],

283-

{ allowFailure: true },

331+

const result = await withDockerProbeTimeout(params.timeoutMs, (signal) =>

332+

params.execDockerRawFn(

333+

["ps", "-a", "--filter", "label=openclaw.sandboxBrowser=1", "--format", "{{.Names}}"],

334+

{ allowFailure: true, signal },

335+

),

284336

);

285337

if (result.code !== 0) {

286338

return null;

@@ -290,24 +342,31 @@ async function listSandboxBrowserContainers(

290342

.split(/\r?\n/)

291343

.map((entry) => entry.trim())

292344

.filter(Boolean);

293-

} catch {

345+

} catch (err) {

346+

if (isDockerProbeTimeoutError(err)) {

347+

params.onTimeout?.();

348+

}

294349

return null;

295350

}

296351

}

297352298353

async function readSandboxBrowserHashLabels(params: {

299354

containerName: string;

300355

execDockerRawFn: ExecDockerRawFn;

356+

timeoutMs: number;

357+

onTimeout?: () => void;

301358

}): Promise<{ configHash: string | null; epoch: string | null } | null> {

302359

try {

303-

const result = await params.execDockerRawFn(

304-

[

305-

"inspect",

306-

"-f",

307-

'{{ index .Config.Labels "openclaw.configHash" }}\t{{ index .Config.Labels "openclaw.browserConfigEpoch" }}',

308-

params.containerName,

309-

],

310-

{ allowFailure: true },

360+

const result = await withDockerProbeTimeout(params.timeoutMs, (signal) =>

361+

params.execDockerRawFn(

362+

[

363+

"inspect",

364+

"-f",

365+

'{{ index .Config.Labels "openclaw.configHash" }}\t{{ index .Config.Labels "openclaw.browserConfigEpoch" }}',

366+

params.containerName,

367+

],

368+

{ allowFailure: true, signal },

369+

),

311370

);

312371

if (result.code !== 0) {

313372

return null;

@@ -317,7 +376,10 @@ async function readSandboxBrowserHashLabels(params: {

317376

configHash: normalizeDockerLabelValue(hashRaw),

318377

epoch: normalizeDockerLabelValue(epochRaw),

319378

};

320-

} catch {

379+

} catch (err) {

380+

if (isDockerProbeTimeoutError(err)) {

381+

params.onTimeout?.();

382+

}

321383

return null;

322384

}

323385

}

@@ -349,11 +411,16 @@ function isLoopbackPublishHost(host: string): boolean {

349411

async function readSandboxBrowserPortMappings(params: {

350412

containerName: string;

351413

execDockerRawFn: ExecDockerRawFn;

414+

timeoutMs: number;

415+

onTimeout?: () => void;

352416

}): Promise<string[] | null> {

353417

try {

354-

const result = await params.execDockerRawFn(["port", params.containerName], {

355-

allowFailure: true,

356-

});

418+

const result = await withDockerProbeTimeout(params.timeoutMs, (signal) =>

419+

params.execDockerRawFn(["port", params.containerName], {

420+

allowFailure: true,

421+

signal,

422+

}),

423+

);

357424

if (result.code !== 0) {

358425

return null;

359426

}

@@ -362,21 +429,37 @@ async function readSandboxBrowserPortMappings(params: {

362429

.split(/\r?\n/)

363430

.map((entry) => entry.trim())

364431

.filter(Boolean);

365-

} catch {

432+

} catch (err) {

433+

if (isDockerProbeTimeoutError(err)) {

434+

params.onTimeout?.();

435+

}

366436

return null;

367437

}

368438

}

369439370440

export async function collectSandboxBrowserHashLabelFindings(params?: {

371441

execDockerRawFn?: ExecDockerRawFn;

442+

timeoutMs?: number;

372443

}): Promise<SecurityAuditFinding[]> {

373444

const findings: SecurityAuditFinding[] = [];

445+

const timeoutMs = normalizeDockerProbeTimeoutMs(params?.timeoutMs);

446+

let timedOut = false;

447+

const markTimedOut = () => {

448+

timedOut = true;

449+

};

374450

const [execFn, browserHashEpoch] = await Promise.all([

375451

params?.execDockerRawFn ? Promise.resolve(params.execDockerRawFn) : loadExecDockerRaw(),

376452

loadSandboxBrowserSecurityHashEpoch(),

377453

]);

378-

const containers = await listSandboxBrowserContainers(execFn);

454+

const containers = await listSandboxBrowserContainers({

455+

execDockerRawFn: execFn,

456+

timeoutMs,

457+

onTimeout: markTimedOut,

458+

});

379459

if (!containers || containers.length === 0) {

460+

if (timedOut) {

461+

findings.push(buildSandboxBrowserDockerProbeTimeoutFinding(timeoutMs));

462+

}

380463

return findings;

381464

}

382465

@@ -385,7 +468,15 @@ export async function collectSandboxBrowserHashLabelFindings(params?: {

385468

const nonLoopbackPublished: string[] = [];

386469387470

for (const containerName of containers) {

388-

const labels = await readSandboxBrowserHashLabels({ containerName, execDockerRawFn: execFn });

471+

const labels = await readSandboxBrowserHashLabels({

472+

containerName,

473+

execDockerRawFn: execFn,

474+

timeoutMs,

475+

onTimeout: markTimedOut,

476+

});

477+

if (timedOut) {

478+

break;

479+

}

389480

if (!labels) {

390481

continue;

391482

}

@@ -398,7 +489,12 @@ export async function collectSandboxBrowserHashLabelFindings(params?: {

398489

const portMappings = await readSandboxBrowserPortMappings({

399490

containerName,

400491

execDockerRawFn: execFn,

492+

timeoutMs,

493+

onTimeout: markTimedOut,

401494

});

495+

if (timedOut) {

496+

break;

497+

}

402498

if (!portMappings?.length) {

403499

continue;

404500

}

@@ -449,9 +545,26 @@ export async function collectSandboxBrowserHashLabelFindings(params?: {

449545

});

450546

}

451547548+

if (timedOut) {

549+

findings.push(buildSandboxBrowserDockerProbeTimeoutFinding(timeoutMs));

550+

}

551+452552

return findings;

453553

}

454554555+

function buildSandboxBrowserDockerProbeTimeoutFinding(timeoutMs: number): SecurityAuditFinding {

556+

return {

557+

checkId: "sandbox.browser_container.docker_probe_timeout",

558+

severity: "warn",

559+

title: "Sandbox browser Docker audit probe timed out",

560+

detail:

561+

`Docker did not answer within ${timeoutMs}ms while checking sandbox browser containers. ` +

562+

"OpenClaw skipped any remaining sandbox browser container drift checks for this status run.",

563+

remediation:

564+

"Retry after Docker is responsive, or recreate sandbox browser containers if drift is suspected.",

565+

};

566+

}

567+455568

export async function collectIncludeFilePermFindings(params: {

456569

configSnapshot: ConfigFileSnapshot;

457570

env?: NodeJS.ProcessEnv;