Skip to content

๐Ÿ›ก๏ธ Sentinel: [HIGH] Fix empty hostname SSRF bypass - #1068

Draft
seonghobae wants to merge 92 commits into
developfrom
sentinel/fix-empty-hostname-ssrf-14253541902387870366
Draft

๐Ÿ›ก๏ธ Sentinel: [HIGH] Fix empty hostname SSRF bypass#1068
seonghobae wants to merge 92 commits into
developfrom
sentinel/fix-empty-hostname-ssrf-14253541902387870366

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Security objective

Close the empty-host / unresolved-host SSRF validation weakness at its causal runtime boundary and preserve the defect class as executable AppGuardrail detection evidence.

Protected predecessor logic could normalize a missing hostname to "", let it reach DNS resolution, ignore socket.gaierror, and return success. This branch rejects missing hosts before DNS/IP validation and fails closed when a public destination cannot be established.

Runtime + detector contract

  • appguardrail_core.controlplane._is_safe_url is the causal webhook/storage/redirect boundary; CLI _is_safe_url is defense in depth.
  • Packaged HIGH/CWE-918 python-ssrf-empty-host-fail-open keeps bounded production _scan_file evidence for direct/empty-string-normalized hosts, multiline definitions, annotated assignments, dominating vs conditional guards, nonempty fallbacks, tuple DNS exceptions, diagnostic fallthrough, falsy/raise termination, and reviewed truthy success forms.
  • Pinned HTTPS remains an independent transport obligation.

RED โ†’ GREEN lineage

  • runtime fail-closed DNS repair: 62df0db1a831985fc34dbdc3565cfa2688facc98 โ†’ deterministic redirect evidence 5b79be8144f0444535ab12290851b7f8afe28538;
  • detector edge RED/GREEN: 38bde3b74ec0ed606e884b9620273f60285c641c โ†’ 438c5ae5e607fe03bdeece44e4ab30dd55e8b67b;
  • CLI resolver parity RED/GREEN: cb89d786f31ecf47dd24cda590c485ede2717194 โ†’ 8c06fe741a4c63d43495e536d06f0f2419a3109f.

Intervening-delta repair and successor consolidation

Earlier verified descendant 3c015e2e76d9df7cb20e5577c310fc3f2567519d retained the reviewed detector grammar and the credential-only hostless fixture used to consolidate generated PR #1103.

A later three-commit descendant ending at c5874eff879ee988d4b650bc2a952d3dae9a04da was re-read rather than treated as a race. Relative to 3c015e2... it removed tests/test_ssrf_empty_host_credentials_contract.py and tests/test_ssrf_empty_host_detector_edge_contract.py, narrowed the detector regex, and modified the general SSRF regression. The deleted contracts and narrowed detector were valid repair findings.

Normal descendants restored the reviewed detector and both lost regression surfaces without force/rebase:

Fresh compare 3c015e2...bce5490 is ahead 6 / behind 0. Its only effective differences are the preserved deterministic tests/test_ssrf_protection.py refinement and the expanded hostless-credential regression; the detector and deleted edge contract are restored to the reviewed semantics.

Generated PR #1113's runtime guard is already present here for both control-plane and CLI. Its http://, http://user@, and http://user@/ behavioral evidence is now fully represented on this canonical lineage. Its generated .jules/sentinel.md repository-wide doctrine is not an independent product/security contract and is not required for succession.

Exact authority

  • protected base: develop@e71d37e7c58118e6764c96ab7c4492fe33eed6f8
  • exact head: 2379b37f05b12af8e22990965d42da2e69b9c611
  • branch: sentinel/fix-empty-hostname-ssrf-14253541902387870366
  • Draft; no force-push/destructive rebase/self-approval/gate weakening

Exact head 2379b37... is a source-neutral descendant and adds no product/security delta. All eight repository workflows are terminal success on this exact head. CodeQL PR run 34155024470 successfully dispatched exact-head Python and Actions analysis, then failed closed at VERDICT_STATE=pending; this is neither a source failure nor GREEN. No qualifying current-head approval exists. One outdated detector thread remains open until an independent current-head review confirms the bounded truthy-return repair. Predecessor evidence does not transfer.

Merge boundary

Not merge-ready. Require unchanged exact-head terminal-success applicable checks, qualifying independent current-head review, and ordinary protected-branch acceptance. No self-approval, stale evidence, force update, detector waiver, source-neutral retrigger, administrator bypass, or required-check weakening.

Generated PR #1128 complete carryover

Fresh comparison at 4a76b955ecc6e767e137ac15e82b83a2af148386 verified that this lane completely carries #1128's current hostless rejection and http:// / http://user@ regression obligations for both validators and the control-plane API. #1128's body-mentioned tests/test_hostless_url_admission.py is absent from its current four-file patch; its generated doctrine is not an independent product/security delta. #1128 may therefore be retired only as verified complete successor carryover, while this Draft remains the single writer.

The current head commit is a source-neutral workflow-retrigger descendant and adds no product/security delta. This checkpoint does not reuse the retrigger as proof and creates no further no-op commit; future transient workflow retries should use the GitHub rerun API.

@google-labs-jules

Copy link
Copy Markdown

๐Ÿ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a ๐Ÿ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@github-project-automation github-project-automation Bot moved this to Backlog in Security Aug 30, 2026
@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • โ–ถ๏ธ Resume reviews
  • ๐Ÿ” Trigger review
๐Ÿ“ Walkthrough

Walkthrough

๋‘ URL ๊ฒ€์ฆ๊ธฐ๊ฐ€ ๋นˆ ํ˜ธ์ŠคํŠธ๋ช…์„ DNS ํ•ด์„ ์ „์— ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. DNS ํ•ด์„ ์‹คํŒจ๋„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. HIGH ๋“ฑ๊ธ‰ SSRF fail-open ํƒ์ง€ ๊ทœ์น™๊ณผ ๋ณด์•ˆ ํ”ฝ์Šค์ฒ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทœ์น™์˜ ๋ฐ˜ํ™˜์‹๊ณผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

Changes

๋นˆ ํ˜ธ์ŠคํŠธ๋ช… SSRF ์ฐจ๋‹จ

Layer / File(s) Summary
ํ˜ธ์ŠคํŠธ๋ช… ๊ฒ€์ฆ ๋ฐ ๋Ÿฐํƒ€์ž„ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ
appguardrail_core/controlplane.py, scanner/cli/appguardrail.py, tests/test_ssrf_protection.py, tests/test_controlplane.py, .jules/sentinel.md
๋‘ _is_safe_url ๊ตฌํ˜„์ด ๋นˆ ํ˜ธ์ŠคํŠธ๋ช…์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. DNS ํ•ด์„ ์‹คํŒจ๋„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ URL๊ณผ ์›นํ›… ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณต๊ฐœ IP ๋ฐ ๋ชจํ‚น๋œ DNS ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ธฐ๋ก์— ์ทจ์•ฝ์ ๊ณผ ์ˆ˜์ • ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋นˆ ํ˜ธ์ŠคํŠธ SSRF ํƒ์ง€ ๊ทœ์น™
scanner/rules/ssrf_empty_host.yml, tests/fixtures/security_corpus/*empty_host_ssrf*, CHANGELOG.d/1068-empty-host-ssrf.md, docs/TRACEABILITY.md
๋นˆ ํ˜ธ์ŠคํŠธ๋ช…์„ DNS์— ์ „๋‹ฌํ•œ ๋’ค socket.gaierror๋ฅผ ๋ฌด์‹œํ•˜๋Š” Python ํŒจํ„ด์„ ํƒ์ง€ํ•˜๋Š” HIGH ๋“ฑ๊ธ‰ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ทจ์•ฝยท์ˆ˜์ • ํ”ฝ์Šค์ฒ˜์™€ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ถ”์ ์„ฑ ๊ทœ์น™์„ ๊ฐฑ์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํƒ์ง€ ๊ทœ์น™ ํšŒ๊ท€ ๊ฒ€์ฆ
tests/test_ssrf_empty_host_validator_rule.py, tests/test_ssrf_empty_host_return_expression_regression.py, tests/test_ssrf_empty_host_sibling_except_regression.py, tests/test_ssrf_empty_host_current_review_regressions.py
๊ทœ์น™ ๋“ฑ๋ก, ์ทจ์•ฝ ํ”ฝ์Šค์ฒ˜ ํƒ์ง€, ํ˜ธ์ŠคํŠธ ๊ฐ€๋“œ, ๋ฐ˜ํ™˜์‹, ์กฐ๊ฑด์‹, ์˜ˆ์™ธ ํŠœํ”Œ, ์ข…๋ฃŒ ๊ฒฝ๊ณ„, ํ•จ์ˆ˜ ๊ฒฝ๊ณ„๋ฅผ ํ”„๋กœ๋•์…˜ ์Šค์บ๋„ˆ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Merge Risk: ๐ŸŸก Moderate ยท up to 81ee5

The runtime SSRF boundary now rejects empty and unresolved hosts, but the packaged detector can still miss documented vulnerable patterns and one regression test is DNS-dependent. The detector gap should be resolved before merge.

๐Ÿšฅ Pre-merge checks | โœ… 4 | โŒ 1

โŒ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage โš ๏ธ Warning Docstring coverage is 67.24% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 58 functions across 10 files. (2 skipped:โ€ฆ Write docstrings for the functions missing them to satisfy the coverage threshold.
โœ… Passed checks (4 passed)
Check name Status Explanation
Linked Issues check โœ… Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check โœ… Passed Check skipped because no linked issues were found for this pull request.
Description Check โœ… Passed Check skipped - CodeRabbitโ€™s high-level summary is enabled.
Title check โœ… Passed PR ์ œ๋ชฉ์€ ๋นˆ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” HIGH ๋“ฑ๊ธ‰ SSRF ์šฐํšŒ ์ˆ˜์ •์ด๋ผ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ์„ ์ •ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
Full details: Docstring Coverage

Explanation

Docstring coverage is 67.24% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 58 functions across 10 files. (2 skipped: 2 unsupported.)

  • Fix all pre-merge checks with AI
โœจ Finishing Touches ๐Ÿ’ก 1
๐Ÿ“ Generate docstrings ๐Ÿ’ก
  • Create stacked PR
  • Commit on current branch
๐Ÿงช Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sentinel/fix-empty-hostname-ssrf-14253541902387870366

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

โค๏ธ Share

Comment @coderabbitai help to get the list of available commands.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

Copy link
Copy Markdown
Contributor Author

2026-09-07 exact-head successor consolidation

Generated PR #1128 was re-fetched at exact head 4a76b955ecc6e767e137ac15e82b83a2af148386 and compared with this canonical security lane at exact head a1174b33d194ec2421015cb54fa327bd5b6f7ad0; both fork protected develop@e71d37e7c58118e6764c96ab7c4492fe33eed6f8.

Verified complete carryover of every valid #1128 delta:

  • both appguardrail_core.controlplane._is_safe_url and CLI _is_safe_url reject a missing hostname before DNS/IP validation;
  • direct production regressions reject http:// and http://user@ in both validators, while the control-plane API contract rejects the same inputs with HTTP 400;
  • this lane additionally fails closed on socket.gaierror, packages python-ssrf-empty-host-fail-open, and retains vulnerable/fixed corpus, traceability, and broader FP/FN regressions;
  • fix(webhook): reject hostless HTTP(S) authoritiesย #1128's body names tests/test_hostless_url_admission.py, but that path is absent from its current four-file patch, so it is not an uncarried current-head delta;
  • the generated .jules/sentinel.md prose is repository-wide doctrine, not an independent product/security contract, and this lane already carries equivalent doctrine.

Therefore #1128 can be retired only as a verified complete-successor carryover, not as a claim that its finding was invalid. No commit or valid requirement is discarded.

Current acceptance remains blocked: eight repository-local workflows are exact-head success, but CodeQL PR run 33996585942 has DISPATCH_OUTCOME=success and VERDICT_STATE=pending; it intentionally fails until the authenticated terminal verdict is published. There is also no qualifying independent APPROVED review and one current review thread remains unresolved. This PR stays Draft and is not merged or auto-merged.

@google-labs-jules

Copy link
Copy Markdown

2026-09-07 exact-head successor consolidation

Generated PR #1128 was re-fetched at exact head 4a76b955ecc6e767e137ac15e82b83a2af148386 and compared with this canonical security lane at exact head a1174b33d194ec2421015cb54fa327bd5b6f7ad0; both fork protected develop@e71d37e7c58118e6764c96ab7c4492fe33eed6f8.

Verified complete carryover of every valid #1128 delta:

  • both appguardrail_core.controlplane._is_safe_url and CLI _is_safe_url reject a missing hostname before DNS/IP validation;
  • direct production regressions reject http:// and http://user@ in both validators, while the control-plane API contract rejects the same inputs with HTTP 400;
  • this lane additionally fails closed on socket.gaierror, packages python-ssrf-empty-host-fail-open, and retains vulnerable/fixed corpus, traceability, and broader FP/FN regressions;
  • fix(webhook): reject hostless HTTP(S) authoritiesย #1128's body names tests/test_hostless_url_admission.py, but that path is absent from its current four-file patch, so it is not an uncarried current-head delta;
  • the generated .jules/sentinel.md prose is repository-wide doctrine, not an independent product/security contract, and this lane already carries equivalent doctrine.

Therefore #1128 can be retired only as a verified complete-successor carryover, not as a claim that its finding was invalid. No commit or valid requirement is discarded.

Current acceptance remains blocked: eight repository-local workflows are exact-head success, but CodeQL PR run 33996585942 has DISPATCH_OUTCOME=success and VERDICT_STATE=pending; it intentionally fails until the authenticated terminal verdict is published. There is also no qualifying independent APPROVED review and one current review thread remains unresolved. This PR stays Draft and is not merged or auto-merged.

ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. PR #1128 ์˜ ์œ ํšจํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ณธ PR์— ๋ชจ๋‘ ๋ฐ˜์˜๋˜์–ด ํ†ตํ•ฉ๋œ ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ๋ชจ๋“  ์ž‘์—…์—์„œ ์ฝ”๋“œ์˜ ๋ณ‘ํ•ฉ ์ด๋ ฅ ๋ฐ ์ธ์ฆ๋œ ํŒ์ •(CodeQL)์˜ ๊ฒฐ๊ณผ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ค€์ˆ˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šน์ธ์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@seonghobae seonghobae removed the status: needs-review Open pull request requiring current-head review or checks label Sep 6, 2026
@seonghobae seonghobae added the status: draft Draft pull request label Sep 6, 2026 — with ChatGPT Codex Connector
seonghobae added a commit that referenced this pull request Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Re-fetched the concurrent exact head 5897711198b148ae5e5b85ff4308ff0b4d387487. A fresh compare from a1174b33d194ec2421015cb54fa327bd5b6f7ad0 reports ahead 1 / behind 0 with zero changed files, so the new descendant preserves the full runtime/detector/test delta and is source-neutral. Current-head Tests, Security Process, Pinned HTTPS, OpenSSF, scan-path and retention coverage are GREEN; Security Scan, SAST Semgrep and CodeQL remain queued. Review inventory is 97 COMMENTED / 0 APPROVED with one unresolved outdated detector thread. The PR body and single-writer Gap baseline now point to this exact head; no predecessor acceptance was transferred.

@google-labs-jules

Copy link
Copy Markdown

Re-fetched the concurrent exact head 5897711198b148ae5e5b85ff4308ff0b4d387487. A fresh compare from a1174b33d194ec2421015cb54fa327bd5b6f7ad0 reports ahead 1 / behind 0 with zero changed files, so the new descendant preserves the full runtime/detector/test delta and is source-neutral. Current-head Tests, Security Process, Pinned HTTPS, OpenSSF, scan-path and retention coverage are GREEN; Security Scan, SAST Semgrep and CodeQL remain queued. Review inventory is 97 COMMENTED / 0 APPROVED with one unresolved outdated detector thread. The PR body and single-writer Gap baseline now point to this exact head; no predecessor acceptance was transferred.

ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„/ํƒ์ง€๊ธฐ/ํ…Œ์ŠคํŠธ ์ฐจ์ด๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์œ ์ง€๋˜์—ˆ์œผ๋ฉฐ ํ˜„์žฌ ์†Œ์Šค์— ์–ด๋– ํ•œ ํ‡ดํ–‰๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ž„์„ ์ธ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. CodeQL ๋ฐ ๋‚˜๋จธ์ง€ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋“ค์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

seonghobae added a commit that referenced this pull request Sep 7, 2026
seonghobae added a commit that referenced this pull request Sep 7, 2026
Summary:
- Snapshot 19:03 UTC records Draft #1161 `a92e936` stacked on #1158.
- Named secrets in MCP env/args/command fail closed.
- Jules #1159 empty-host SSRF stays Draft under #1068.

Rationale:
- #999 is the single writer of the product-technical gap baseline.
- #1099 remaining surfaces stay on stacked successors, not Close.

Tests:
- documentation-only; detector evidence lives on #1161 (1929/1929)

Copy link
Copy Markdown
Contributor Author

Canonical succession update from generated #1159.

Fresh live authority before this mutation: protected develop@e71d37e7c58118e6764c96ab7c4492fe33eed6f8; #1068 was already the stronger owner because it repairs both control-plane and CLI validators, fails closed on unresolved non-empty destinations, and carries the detector/fixture/traceability corpus. #1159 only repaired the control-plane missing-host guard and its generated description overclaimed a CRITICAL empty-host SSRF exploit.

I preserved the one valid stronger regression shape introduced while repairing #1159 by adding tests/test_ssrf_missing_hostname_resolution_contract.py on this canonical branch. Current exact #1068 head is 37cb9e4b28173bbf82ffd2808514bc0fdbe83558.

The new contract runs against both validators and proves http://, https://, credential-only authorities, and http:///path are rejected before socket.getaddrinfo can run. It therefore strengthens the existing final-boolean hostless tests without retaining #1159's weaker socket.gaierror => allow dummy domain behavior, which conflicts with #1068's established fail-closed resolver policy.

#1159 now has no valid semantic production delta that is stronger than this owner lineage. Retire it only after verifying this exact successor head retains the new test plus the existing runtime/detector/fixture/TRACEABILITY corpus; do not transfer #1159 predecessor checks/reviews. New exact-head hosted checks/review remain authoritative.

@google-labs-jules

Copy link
Copy Markdown

Canonical succession update from generated #1159.

Fresh live authority before this mutation: protected develop@e71d37e7c58118e6764c96ab7c4492fe33eed6f8; #1068 was already the stronger owner because it repairs both control-plane and CLI validators, fails closed on unresolved non-empty destinations, and carries the detector/fixture/traceability corpus. #1159 only repaired the control-plane missing-host guard and its generated description overclaimed a CRITICAL empty-host SSRF exploit.

I preserved the one valid stronger regression shape introduced while repairing #1159 by adding tests/test_ssrf_missing_hostname_resolution_contract.py on this canonical branch. Current exact #1068 head is 37cb9e4b28173bbf82ffd2808514bc0fdbe83558.

The new contract runs against both validators and proves http://, https://, credential-only authorities, and http:///path are rejected before socket.getaddrinfo can run. It therefore strengthens the existing final-boolean hostless tests without retaining #1159's weaker socket.gaierror => allow dummy domain behavior, which conflicts with #1068's established fail-closed resolver policy.

#1159 now has no valid semantic production delta that is stronger than this owner lineage. Retire it only after verifying this exact successor head retains the new test plus the existing runtime/detector/fixture/TRACEABILITY corpus; do not transfer #1159 predecessor checks/reviews. New exact-head hosted checks/review remain authoritative.

ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. PR #1159์˜ ์œ ํšจํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ(ํ…Œ์ŠคํŠธ ๋ณด๊ฐ• ๋“ฑ)์ด ๋ชจ๋‘ ํ˜„์žฌ HEAD(37cb9e4b28173bbf82ffd2808514bc0fdbe83558)์— ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ˜์˜๋˜์–ด ํ†ตํ•ฉ๋œ ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„/ํƒ์ง€๊ธฐ/ํ…Œ์ŠคํŠธ ๋ฐ ์ •์ฑ…(DNS fail-closed) ๋ชจ๋‘ ๊ฐ•ํ™”๋˜์—ˆ์œผ๋ฉฐ, ์ƒˆ๋กœ์šด exact-head CI ์ ๊ฒ€์ด ์ˆ˜ํ–‰๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

seonghobae added a commit that referenced this pull request Sep 7, 2026
Summary:
- Snapshot 20:04 UTC records Draft #1165 `5790559` stacked on #1164.
- Setuid/setgid and world-writable executable/hook modes fail closed.
- #1068 live head `2379b37` is another empty Strix retrigger.

Rationale:
- #999 is the single writer of the product-technical gap baseline.
- #1099 remaining surfaces stay on stacked successors, not Close.

Tests:
- documentation-only; detector evidence lives on #1165 (2035/2035)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high status: draft Draft pull request type: bug Defect or incorrect behavior

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

1 participant