Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
b4d6429
ci(security): audit Rust dependencies on changes and weekly
Ayinkx01 Oct 27, 2026
67de778
build: declare the tested minimum Rust version
Ayinkx01 Oct 27, 2026
1946050
docs: align project status with MSRV and security CI
Ayinkx01 Oct 27, 2026
9d0f537
docs: link Drips readiness checklist from README
Ayinkx01 Oct 27, 2026
b05451b
ci: pin third-party workflow actions to immutable commits
Ayinkx01 Oct 27, 2026
140e3a5
ci(security): pin fuzz workflow actions to immutable commits
Ayinkx01 Oct 27, 2026
294fbc7
feat: implement RPC, WASM inspection, analysis, config and release va…
Ayinkx01 Oct 28, 2026
717ef40
fix: declare transport and wasm parser workspace dependencies
Ayinkx01 Oct 28, 2026
50b1bc9
docs: add release readiness checklist
Ayinkx01 Oct 28, 2026
aa333c4
fix: make finding severity copyable for SARIF mapping
Ayinkx01 Oct 28, 2026
bf7cb88
feat(cli): depend on contract, analysis and config libraries
Ayinkx01 Oct 28, 2026
5058871
feat(cli): expose WASM analysis and live RPC health commands
Ayinkx01 Oct 28, 2026
c6d185f
docs: document WASM and RPC CLI commands
Ayinkx01 Oct 28, 2026
c6feb6d
docs: clarify CLI and SARIF integration status
Ayinkx01 Oct 28, 2026
003a506
fix(cli): avoid borrowing findings after moving them into JSON
Ayinkx01 Oct 28, 2026
5cc9751
style: format analysis and SARIF implementation
Ayinkx01 Oct 28, 2026
00a3e33
style: format new CLI command handlers
Ayinkx01 Oct 28, 2026
450fc11
style: format config implementation
Ayinkx01 Oct 28, 2026
800e00a
style: format WASM inspection implementation
Ayinkx01 Oct 28, 2026
22d2f07
style: format bounded HTTP RPC transport
Ayinkx01 Oct 28, 2026
039e055
style: finish formatting bounded WASM file reader
Ayinkx01 Oct 28, 2026
66a5f4d
docs: align Drips readiness with current implementation
Ayinkx01 Oct 28, 2026
8b862ff
docs: correct project status and integration gaps
Ayinkx01 Oct 28, 2026
0b1c99e
docs: record current implementation and limitations
Ayinkx01 Oct 28, 2026
6dbbf42
build: add temporary lockfile refresh workflow
Ayinkx01 Oct 28, 2026
0ff9d97
build: regenerate Cargo.lock
github-actions[bot] Oct 28, 2026
919011d
chore: remove temporary lockfile refresh workflow
Ayinkx01 Oct 28, 2026
4ea8747
merge: reconcile security hardening with devkit implementation
Ayinkx01 Oct 28, 2026
173a946
ci: enforce locked builds and test declared MSRV
Ayinkx01 Oct 28, 2026
6052a8f
docs: update appeal readiness after branch reconciliation
Ayinkx01 Oct 28, 2026
0b7e977
docs: record combined CI and outstanding audit
Ayinkx01 Oct 28, 2026
4da84f1
docs: refresh Drips application draft with verified scope
Ayinkx01 Oct 28, 2026
f3d2bc8
docs: keep CI status wording current
Ayinkx01 Oct 28, 2026
18f038e
docs: finalize Drips readiness evidence
Ayinkx01 Oct 28, 2026
840d6a5
feat(cli): wire RPC config and timeout settings
Ayinkx01 Oct 28, 2026
892f575
test(cli): cover RPC config loading
Ayinkx01 Oct 28, 2026
083aff4
docs(cli): document RPC config and timeout overrides
Ayinkx01 Oct 28, 2026
a712999
docs: record CLI config integration
Ayinkx01 Oct 28, 2026
3900ccc
feat(contract): use Stellar XDR for contract specs
Ayinkx01 Oct 28, 2026
3195c58
feat(contract): decode bounded contractspecv0 XDR entries
Ayinkx01 Oct 28, 2026
eb5ba98
ci(security): add manual SARIF code scanning upload
Ayinkx01 Oct 28, 2026
8cd33bd
docs: update contract spec and SARIF capabilities
Ayinkx01 Oct 28, 2026
c70447c
docs: update integrated capability and validation status
Ayinkx01 Oct 28, 2026
b5d865a
docs: refresh Drips readiness for remaining work
Ayinkx01 Oct 28, 2026
dbaf9eb
test(contract): reject malformed contract spec XDR
Ayinkx01 Oct 28, 2026
e4ce249
fix(analysis): initialize contract spec report field
Ayinkx01 Oct 28, 2026
9655ef4
docs(contract): describe bounded XDR spec decoding
Ayinkx01 Oct 28, 2026
cdba7b0
docs(contract): describe bounded XDR spec decoding
Ayinkx01 Oct 28, 2026
a37a990
docs(contract): describe bounded XDR spec decoding
Ayinkx01 Oct 28, 2026
a2794a3
docs: update appeal draft with completed integrations
Ayinkx01 Oct 28, 2026
f60442b
style(cli): format config integration
Ayinkx01 Oct 28, 2026
5c270c8
style(contract): format malformed spec test
Ayinkx01 Oct 28, 2026
05afde9
build: sync lockfile with contract spec decoder
Ayinkx01 Oct 28, 2026
a8b3a48
fix(contract): correct WASM test fixture bytes
Ayinkx01 Oct 28, 2026
e412df9
fix(contract): correct WASM test fixture bytes
Ayinkx01 Oct 28, 2026
e10db5a
docs: refresh changelog after remaining integrations
Ayinkx01 Oct 28, 2026
a1ed7e5
docs: correct remaining capability notes
Ayinkx01 Oct 28, 2026
2fff36e
fix(cli): remove unnecessary config mutability
Ayinkx01 Oct 28, 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
31 changes: 21 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ jobs:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
with:
components: rustfmt
- run: cargo fmt --all -- --check
Expand All @@ -32,12 +32,12 @@ jobs:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --all-targets --all-features -- -D warnings
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2
- run: cargo clippy --locked --all-targets --all-features -- -D warnings

test:
name: Test (${{ matrix.os }})
Expand All @@ -47,7 +47,18 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo test --all --all-features
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2
- run: cargo test --locked --all --all-features

msrv:
name: MSRV (Rust 1.91.0)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
with:
toolchain: 1.91.0
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2
- run: cargo test --locked --all --all-features
8 changes: 5 additions & 3 deletions .github/workflows/fuzz.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@ jobs:
name: Fuzz smoke
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # pinned action
with:
toolchain: nightly
- uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2
with:
workspaces: fuzz
- name: Install cargo-fuzz
Expand Down
24 changes: 24 additions & 0 deletions .github/workflows/release-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Release validation

on:
push:
tags: ["v*.*.*"]
workflow_dispatch:

permissions:
contents: read

jobs:
validate:
name: Validate release artifacts
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- run: cargo fmt --all -- --check
- run: cargo clippy --workspace --all-targets --all-features -- -D warnings
- run: cargo test --workspace --all-features
- run: cargo package --workspace --no-verify
41 changes: 41 additions & 0 deletions .github/workflows/security-audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Dependency Security Audit

on:
pull_request:
paths:
- "Cargo.lock"
- "**/Cargo.toml"
- ".github/workflows/security-audit.yml"
push:
branches: [main]
paths:
- "Cargo.lock"
- "**/Cargo.toml"
- ".github/workflows/security-audit.yml"
schedule:
- cron: "23 4 * * 1"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: dependency-audit-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
audit:
name: RustSec advisory audit
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install stable Rust
uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
- name: Install cargo-audit
run: cargo install cargo-audit --locked
- name: Audit locked dependencies
run: cargo audit --file Cargo.lock
41 changes: 41 additions & 0 deletions .github/workflows/upload-sarif.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Upload contract analysis to GitHub code scanning

on:
workflow_dispatch:
inputs:
wasm_path:
description: Repository-relative path to a Soroban contract WASM artifact
required: true
type: string

permissions:
contents: read
security-events: write
actions: read

jobs:
analyze:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install stable Rust
uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
- name: Validate artifact path
env:
WASM_PATH: ${{ inputs.wasm_path }}
shell: bash
run: |
case "$WASM_PATH" in
""|/*|..|../*|*/../*|*/..) echo "wasm_path must be a repository-relative path without parent traversal" >&2; exit 2 ;;
esac
test -f "$WASM_PATH" || { echo "WASM artifact not found in repository" >&2; exit 2; }
- name: Generate SARIF report
env:
WASM_PATH: ${{ inputs.wasm_path }}
run: cargo run --locked --bin stellar-foundry -- --format sarif analyze-wasm "$WASM_PATH" > results.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@4bfa242aa49c5f7c6770b98670d354a7dfac05f8 # v3
with:
sarif_file: results.sarif
category: stellar-foundry-contract-analysis
50 changes: 26 additions & 24 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Workspace with `devkit-core`, `devkit-xdr`, and `devkit-cli`.
- `devkit-core`: `DevkitError`, `Network` profiles with canonical passphrases,
`OutputFormat`.
- `devkit-xdr`: decode base64 `ScVal`, `TransactionEnvelope`, and
`ContractEvent` to JSON with bounded reading; classify Stellar strkeys.
- `stellar-foundry` CLI: `version`, `doctor`, `strkey`, `scval`, `envelope`,
`event`, with terminal and JSON output and stable exit codes.
- `devkit-rpc`: typed Stellar RPC protocol layer with an injectable `Transport`,
a deterministic `MockTransport`, validated `Endpoint` (https only; loopback
`http`; no embedded credentials), typed `Health` / `NetworkInfo` /
`LatestLedger`, `getEvents` and `getFeeStats` passthrough, and a retry policy
that retries only transport failures.
- CLI: `endpoint <URL>` validates an RPC endpoint against the security policy.
- Documentation: ecosystem research, architecture, getting started, CLI
reference, project status, roadmap.
- CI: format, clippy, and tests on Linux, Windows, and macOS.
- Tooling: `tools/changelog.py` generates reviewable release sections from
Conventional Commits; a dry-run workflow runs on demand and on release.
- Benchmark: `cargo run --release -p devkit-xdr --example mem_profile` reports
peak and current memory per decode input size (see `docs/MEMORY.md`).
- Fuzzing: `fuzz/` cargo-fuzz targets for XDR/SCVal decoding, exercised by a
weekly bounded scheduled workflow (see `docs/TESTING.md`).
- Governance: README, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT, LICENSE,
pull-request and issue templates.
- `devkit-contract`: bounded, non-executing WASM validation and structural
metadata for imports, exports, and custom sections.
- `devkit-analysis`: deterministic structural findings with stable rule IDs
and SARIF 2.1.0 serialization.
- `devkit-config`: strict TOML configuration parsing, timeout validation,
environment overrides, and static diagnostic events.
- `devkit-rpc`: bounded HTTP JSON-RPC transport with timeout, redirects
disabled, response-size limits, response validation, and structured errors.
- CLI commands `inspect-wasm`, `analyze-wasm`, and `rpc-health`.
- `rpc-health` now consumes bounded TOML configuration, timeout settings, and environment overrides; endpoint precedence is explicit in the CLI reference.
- Release-validation workflow, release checklist, Drips readiness checklist, and manual SARIF upload workflow for GitHub code scanning.
- RustSec dependency auditing and declared Rust 1.91 workspace MSRV in PR #127.
- Malformed-XDR regression corpus and bounded-input hardening.
- CI: formatting, Clippy, and Linux, Windows, and macOS tests.

### Fixed

- `devkit-xdr`: decoding now applies bounded reader limits instead of
`Limits::none()`. A crafted XDR length prefix can no longer request an
unbounded allocation (memory-exhaustion denial of service); such inputs are
rejected as a structured decode error. Found by the `decode_scval` fuzz target.

### Limitations

- These changes are on open pull-request branches and are not all merged to
`main`.
- `contractspecv0` XDR entries are decoded into official XDR-JSON definitions
with a variant kind and best-effort name; a normalized ABI schema remains future work.
- Analysis findings are structural heuristics, not a comprehensive
vulnerability detector.
- SARIF upload requires manual workflow dispatch, a repository-relative WASM
artifact, and GitHub code-scanning permissions.
- The configuration API is currently wired into `rpc-health`; other commands do not consume RPC configuration because they do not need it.
Loading
Loading