Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
fb5555a
test(security): define DNS-pinned HTTPS resolution contract
seonghobae Aug 7, 2026
ae15820
test(security): define pinned HTTPS redirect contract
seonghobae Aug 7, 2026
dedf78d
test(cli): define pinned control-plane delivery integration
seonghobae Aug 7, 2026
7230320
feat(security): implement DNS-pinned HTTPS transport
seonghobae Aug 7, 2026
57cecd2
test(release): define pinned HTTPS release contract
seonghobae Aug 7, 2026
3da4c99
docs(security): document DNS-pinned control-plane delivery
seonghobae Aug 7, 2026
7b6a597
docs(changelog): record DNS-pinned control-plane delivery
seonghobae Aug 7, 2026
8cc7bc6
ci(security): enforce exact pinned HTTPS coverage
seonghobae Aug 7, 2026
4d3370f
test(security): cover pinned HTTPS validation edges
seonghobae Aug 7, 2026
ece7a17
test(cli): make pinned delivery receipt assertions deterministic
seonghobae Aug 7, 2026
d3ea0ab
ci(security): add bounded pinned HTTPS integration patch
seonghobae Aug 7, 2026
29ab21c
ci(security): verify and finalize pinned HTTPS integration
seonghobae Aug 7, 2026
a3bf6b3
fix(security): preserve zero-port validation and bounded test detail
seonghobae Aug 7, 2026
d833e29
ci(security): retain validated port fix in final integration
seonghobae Aug 7, 2026
b9d7842
ci(security): stage port and bounded-fixture fixes for verified commit
seonghobae Aug 7, 2026
cc3b107
fix(ci): bound one-shot git staging
seonghobae Aug 7, 2026
f0ac5b8
test(security): cover pinned HTTPS statement edges
seonghobae Aug 7, 2026
9046780
ci(security): include pinned HTTPS coverage edges
seonghobae Aug 7, 2026
0dc1f96
test(release): require pinned HTTPS coverage edge suite
seonghobae Aug 7, 2026
3522fff
ci(security): include exact pinned HTTPS coverage edges
seonghobae Aug 7, 2026
41ea836
feat(security): integrate DNS-pinned scan delivery
github-actions[bot] Aug 7, 2026
d4e00b6
docs(security): clarify fail-closed port validation
seonghobae Aug 7, 2026
7d91ac9
test(cli): fail closed on ambiguous endpoints and forged receipts
seonghobae Aug 7, 2026
13108b5
ci(security): add bounded CLI hardening patch
seonghobae Aug 7, 2026
b02d0ce
ci(security): verify and finalize CLI receipt hardening
seonghobae Aug 7, 2026
e03a472
ci(security): run bounded CLI hardening on exact PR head
seonghobae Aug 7, 2026
36e8d91
fix(security): preserve legacy HTTPS error contract wording
seonghobae Aug 7, 2026
1725c29
fix(security): validate control-plane base and receipt metadata
github-actions[bot] Aug 7, 2026
c9a55b5
docs(security): document receipt and base URL trust boundary
seonghobae Aug 7, 2026
a3b340c
test(security): make TLS context fixture compatible with Python 3.11
seonghobae Aug 7, 2026
e8e4631
test(security): make TLS edge context compatible with Python 3.11
seonghobae Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions .github/workflows/pinned-https-coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Pinned HTTPS Coverage

on:
pull_request:
branches: [develop, main]
push:
branches: [develop, main]

permissions:
contents: read

jobs:
exact-pinned-https-coverage:
runs-on: ubuntu-latest
timeout-minutes: 15
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.13'

- name: Install hash-locked test dependencies
run: python -m pip install --disable-pip-version-check --no-cache-dir --require-hashes -r requirements-test.txt

- name: Run DNS-pinned HTTPS contracts
run: |
python -m pytest -q \
tests/test_pinned_https_resolution.py \
tests/test_pinned_https_redirects.py \
tests/test_pinned_https_cli_integration.py \
tests/test_pinned_https_validation_edges.py \
tests/test_pinned_https_coverage_edges.py \
tests/test_pinned_https_release_contract.py \
tests/test_ssrf_protection.py

- name: Verify exact unrounded statement coverage
run: |
python -m scripts.ci.verify_module_coverage \
--module appguardrail_core/pinned_https.py \
--test tests/test_pinned_https_resolution.py \
--test tests/test_pinned_https_redirects.py \
--test tests/test_pinned_https_cli_integration.py \
--test tests/test_pinned_https_validation_edges.py \
--test tests/test_pinned_https_coverage_edges.py \
--test tests/test_pinned_https_release_contract.py
6 changes: 6 additions & 0 deletions CHANGELOG.d/892-pinned-control-plane-delivery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
### Security

- Added DNS-pinned public HTTPS delivery for bearer-authenticated control-plane scan uploads, preserving the original hostname for TLS SNI and certificate verification while connecting only to the exact globally routable addresses admitted by validation.
- Restricted credential-bearing redirects to HTTP 307 and 308, revalidated every hop, and removed `Authorization` and `Proxy-Authorization` case-insensitively whenever the normalized HTTPS origin changes.
- Added bounded timeout, redirect-count, response-size, JSON, and non-secret error contracts plus exact statement-coverage and operator documentation for standalone, organization-service, and naruon reuse.
- Reject ambiguous control-plane base URLs and validate receipt identifiers and deploy-blocking counts before rendering terminal output, preventing query/fragment confusion and forged control-sequence messages.
18 changes: 18 additions & 0 deletions appguardrail_core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,16 @@
parse_project_matches as parse_openssf_project_matches,
)
from appguardrail_core.openssf_report import augment_buyer_diligence_report
from appguardrail_core.pinned_https import (
DestinationValidationError,
HTTPSDestination,
PinnedHTTPSConnection,
PinnedHTTPSFailure,
PinnedHTTPSResponse,
ResolvedAddress,
post_json_pinned_https,
resolve_public_https_destination,
)
from appguardrail_core.org_intelligence import (
BuyerEvidenceMetric,
BuyerEvidencePack,
Expand Down Expand Up @@ -146,10 +156,12 @@ def render_buyer_diligence_report(
"CURRENT_SCHEMA_VERSION",
"DEFAULT_RETENTION_DAYS",
"DEPLOY_BLOCKING_SEVERITIES",
"DestinationValidationError",
"DriftAssessment",
"ExternalEngineDecision",
"ExternalScanPlan",
"GENESIS_EVENT_HASH",
"HTTPSDestination",
"MAX_RETENTION_DAYS",
"MIN_RETENTION_DAYS",
"MetricResult",
Expand All @@ -158,9 +170,13 @@ def render_buyer_diligence_report(
"OrgInventory",
"PurgePreview",
"PurgeReceipt",
"PinnedHTTPSConnection",
"PinnedHTTPSFailure",
"PinnedHTTPSResponse",
"PullRequestGateSummary",
"RETENTION_CATEGORIES",
"ReportContext",
"ResolvedAddress",
"RepositoryGateSummary",
"RetentionPolicy",
"RetentionPolicyConflict",
Expand Down Expand Up @@ -198,9 +214,11 @@ def render_buyer_diligence_report(
"normalize_finding",
"normalize_findings",
"parse_openssf_project_matches",
"post_json_pinned_https",
"recompute_event_hash",
"render_buyer_diligence_report",
"render_org_readiness_report",
"resolve_public_https_destination",
"safe_report_snippet",
"sanitize_audit_summary",
"score_sale_readiness",
Expand Down
Loading
Loading