Celebrating our 2025 open-source contributions
Last year, our engineers submitted over 375 pull requests that were merged into non–Trail of Bits repositories, touching more than 90 projects from cryptography libraries to the Rust compiler.
This work reflects one of our driving values: “share what others can use.” The measure isn’t whether you share something, but whether it’s actually useful to someone else. This principle is why we publish handbooks, write blog posts, and release tools like Claude skills, Slither, Buttercup, and Anamorpher.
But this value isn’t limited to our own projects; we also share our efforts with the wider open-source community. When we hit limitations in tools we depend on, we fix them upstream. When we find ways to make the software ecosystem more secure, we contribute those improvements.
Most of these contributions came out of client work—we hit a bug we were able to fix or wanted a feature that didn’t exist. The lazy option would have been forking these projects for our needs or patching them locally. Contributing upstream instead takes longer, but it means the next person doesn’t have to solve the same problem. Some of our work is also funded directly by organizations like the OpenSSF and Alpha-Omega, who we collaborate with to make things better for everyone.
Key contributions
- Sigstore rekor-monitor: rekor-monitor verifies and monitors the Rekor transparency log, which records signing events for software artifacts. With funding from OpenSSF, we’ve been getting rekor-monitor ready for production use. We contributed over 40 pull requests to the Rekor project this year, including support for custom certificate authorities and support for the new Rekor v2. We also added identity monitoring for Rekor v2, which lets package maintainers configure monitored certificate subjects and issuers and then receive alerts whenever matching entries appear in the log. If someone compromises your release process and signs a malicious package with your identity, you’ll know.
- Rust compiler and rust-clippy: Clippy is Rust’s official linting tool, offering over 750 lints to catch common mistakes. We contributed over 20 merged pull requests this year. For example, we extended the
implicit_clonelint to handleto_string()calls, which let us deprecate the redundantstring_to_stringlint. We added replacement suggestions todisallowed_methodsso that teams can suggest alternatives when flagging forbidden API usage, and we added path validation fordisallowed_*configurations so that typos don’t silently disable lint rules. We also extended theQueryStabilitylint to handleIntoIteratorimplementations in rustc, which catches nondeterminism bugs in the compiler. The motivation came from a real issue we spotted: iteration order over hash maps was leaking into rustdoc’s JSON output. - pyca/cryptography: pyca/cryptography is Python’s most widely used cryptography library, providing both high-level recipes and low-level interfaces to common algorithms. With funding from Alpha-Omega, we landed 28 pull requests this year. Our work was aimed at adding a new ASN.1 API, which lets developers define ASN.1 structures using Python decorators and type annotations instead of wrestling with raw bytes or external schema files. Read more in our blog post “Sneak peek: A new ASN.1 API for Python.”
- hevm: hevm is a Haskell implementation of the Ethereum Virtual Machine. It powers both the symbolic and concrete execution in Echidna, our smart contract fuzzer. We contributed 14 pull requests this year, mostly focused on performance: we added cost centers to individual opcodes to ease profiling, optimized memory operations, and made stack and program counter operations strict, which got us double-digit percentage improvements on concrete execution benchmarks. We also implemented cheatcodes like
toStringto improve hevm’s compatibility with Foundry. - PyPI Warehouse: Warehouse powers the Python Package Index (PyPI), which serves over a billion package downloads per day. We continued our long-running collaboration with PyPI and Alpha-Omega, shipping project archival support so that maintainers can signal when packages are no longer actively maintained. We also cut the test suite runtime by 81%, from 163 to 30 seconds, even as test coverage grew to over 4,700 tests.
- pwndbg: pwndbg is a GDB and LLDB plugin that makes debugging and exploit development less painful. Last year, we packaged LLDB support for distributions and improved decompiler integration. We also contributed pull requests to other tools in the space, including pwntools, angr, and Binary Ninja’s API.
A merged pull request is the easy part. The hard part is everything maintainers do before and after: writing extensive documentation, keeping CI green, fielding bug reports, explaining the same thing to the fifth person who asks. We get to submit a fix and move on. They’re still there a year later, making sure it all holds together.
Thanks to everyone who shaped these contributions with us, from first draft to merge. See you next year.
Trail of Bits’ 2025 open-source contributions
AI/ML
- Repo: majiayu000/litellm-rs
- Repo: mlflow/mlflow
- Repo: simonw/llm
- Repo: sst/opencode
Cryptography
- Repo: C2SP/x509-limbo
- By woodruffw
- #381: deps: pin oscrypto to a git ref
- #382: dependabot: use groups
- #385: add webpki::nc::nc-permits-dns-san-pattern
- #386: chore: switch to uv
- #387: chore: clean up the site a bit
- #414: chore: fixup rustls-webpki API usage
- #418: add openssl-3.5 harness
- #419: perf: remove PEM bundles from site render
- #420: pyca: harness: fix max_chain_depth condition
- #434: chore(ci): arm64 runners, pinact
- #435: mkdocs: disable search
- #437: chore: bump limbo
- #445: feat: add CRL builder API
- #446: fix: avoid a redundant condition + bogus type ignore
- By woodruffw
- Repo: certbot/josepy
- Repo: pyca/cryptography
- By facutuesca
- #12807: Update license metadata in
pyproject.tomlaccording to PEP 639 - #13325: Initial implementation of ASN.1 API
- #13449: Add decoding support to ASN.1 API
- #13476: Unify ASN.1 encoding and decoding tests
- #13482: asn1: Add support for bytes, str and bool
- #13496: asn1: Add support for
PrintableString - #13514: x509: rewrite datetime conversion functions
- #13513: asn1: Add support for
UtcTimeandGeneralizedTime - #13542: asn1: Add support for
OPTIONAL - #13570: Fix coverage for declarative_asn1/decode.rs
- #13571: Fix some coverage for declarative_asn1/types.rs
- #13573: Fix coverage for
type_to_tag - #13576: Fix more coverage for declarative_asn1/types.rs
- #13580: Fix coverage for pyo3::DowncastIntoError conversion
- #13579: Fix coverage for declarative_asn1::Type variants
- #13562: asn1: Add support for
DEFAULT - #13735: asn1: Add support for
IMPLICITandEXPLICIT - #13894: asn1: Add support for
SEQUENCE OF - #13899: asn1: Add support for
SIZEtoSEQUENCE OF - #13908: asn1: Add support for
BIT STRING - #13985: asn1: Add support for
IA5String - #13986: asn1: Add TODO comment for uses of
PyStringMethods::to_cow - #13999: asn1: Add
SIZEsupport toBIT STRING - #14032: asn1: Add
SIZEsupport toOCTET STRING - #14036: asn1: Add
SIZEsupport toUTF8String - #14037: asn1: Add
SIZEsupport toPrintableString - #14038: asn1: Add
SIZEsupport toIA5String
- #12807: Update license metadata in
- By woodruffw
- By facutuesca
- Repo: tamarin-prover/tamarin-prover
Languages and compilers
- Repo: airbus-cert/tree-sitter-powershell
- Repo: cdisselkoen/llvm-ir
- Repo: hyperledger-solang/solang
- By smoelius
- #1680: Fixes two
elided_named_lifetimeswarnings - #1788: Fix typo in codegen/dispatch/polkadot.rs
- #1778: Check command statuses in build.rs
- #1779: Fix two infinite loops in codegen
- #1791: Fix typos in tests/polkadot.rs
- #1793: Fix a small typo affecting
Expression::GetRef - #1802: Rename
binarytobin - #1801: Handle
abi.encode()with empty args - #1800: Store
Namespacereference inBinary - #1837: Silence
mismatched_lifetime_syntaxeslint
- #1680: Fixes two
- By smoelius
- Repo: llvm/clangir
- By wizardengineer
- #1859: [CIR] Fix parsing of #cir.unwind and cir.resume for catch regions
- #1861: [CIR] Added support for
__builtin_ia32_pshufd - #1874: [CIR] Add CIRGenFunction::getTypeSizeInBits and use it for size computation
- #1883: [CIR] Added support for
__builtin_ia32_pslldqi_byteshift - #1964: [CIR] [NFC] Using types explicitly for
pslldqiconstruct - #1886: [CIR] Add support for
__builtin_ia32_psrldqi_byteshift - #2055: [CIR] Backport FileScopeAsm support from upstream
- By wizardengineer
- Repo: rust-lang/rust
Libraries
- Repo: alex/rust-asn1
- Repo: bytecodealliance/wasi-rs
- Repo: cargo-public-api/cargo-public-api
- Repo: di/id
- Repo: di/pip-api
- Repo: fardream/go-bcs
- Repo: frewsxcv/rust-crates-index
- Repo: luser/strip-ansi-escapes
- Repo: psf/cachecontrol
- Repo: tafia/quick-xml
Tech infrastructure
- Repo: Homebrew/homebrew-core
- Repo: NixOS/nixpkgs
- Repo: google/oss-fuzz
- Repo: microsoft/vcpkg
- Repo: microsoft/vcpkg-tool
Software testing tools
- Repo: AFLplusplus/AFLplusplus
- Repo: advanced-security/monorepo-code-scanning-action
- Repo: github/codeql
- Repo: oli-obk/ui_test
- Repo: pypa/abi3audit
- Repo: rust-fuzz/cargo-fuzz
- Repo: rust-lang/cargo
- Repo: rust-lang/rust-clippy
- By smoelius
- #13894: Move
format_push_stringandformat_collectto pedantic - #13669: Two improvements to
disallowed_* - #13893: Add
unnecessary_debug_formattinglint - #13931: Add
ignore_without_reasonlint - #14280: Rename
inconsistent_struct_constructorconfiguration; don’t suggest deprecated configurations - #14376: Make
visit_maphappy path more evident - #14397: Validate paths in
disallowed_*configurations - #14529: Fix a typo in derive.rs comment
- #14733: Don’t warn about unloaded crates
- #14360: Add internal lint
derive_deserialize_allowing_unknown - #15090: Fix typo in tests/ui/missing_const_for_fn/const_trait.rs
- #15357: Fix typo non_std_lazy_statics.rs
- #14177: Extend
implicit_cloneto handleto_stringcalls - #15440: Correct
needless_borrow_for_generic_argsdoc comment - #15592: Commas to semicolons in clippy.toml reasons
- #15862: Allow
explicit_writein tests - #16114: Allow multiline suggestions in
map-unwrap-or
- #13894: Move
- By smoelius
- Repo: rust-lang/rustup
- Repo: zizmorcore/zizmor
Blockchain software
- Repo: anza-xyz/agave
- Repo: argotorg/hevm
- By elopez
- #612: Cleanups in preparation of GHC 9.8
- #663: tests: run
evmon its own directory - #707: Optimize memory representation and operations
- #729: Optimize
maybeLit{Byte,Word,Addr}SimpandmaybeConcStoreSimp - #738: Fix Windows CI build
- #744: Add benchmarking with Solidity examples
- #737: Use
Storablevectors for memory - #760: Avoid fixpoint for literals and concrete storage
- #789: Optimized OpSwap
- #803: Add cost centers to opcodes, optimize
- #808: Optimize
word256Bytes,word160Bytes - #838: Implement
toStringcheatcode - #846: Bump dependency upper bounds
- #883: Fix GHC 9.10 warnings
- By elopez
- Repo: hellwolf/solc.nix
- Repo: rappie/fuzzer-gas-metric-benchmark
Reverse engineering tools
- Repo: Gallopsled/pwntools
- Repo: Vector35/binaryninja-api
- Repo: angr/angr
- Repo: angr/angrop
- Repo: frida/frida-gum
- Repo: jonpalmisc/screenshot_ninja
- Repo: pwndbg/pwndbg
- Repo: quarkslab/quokka
Software analysis/transformation tools
- Repo: pygments/pygments
- Repo: quarkslab/bgraph
Packaging ecosystem/supply chain
- Repo: Homebrew/.github
- Repo: Homebrew/actions
- Repo: Homebrew/brew
- Repo: Homebrew/brew-pip-audit
- Repo: Homebrew/brew.sh
- Repo: Homebrew/homebrew-cask
- Repo: Homebrew/homebrew-command-not-found
- Repo: PyO3/maturin
- Repo: conda/schemas
- Repo: ossf/wg-securing-software-repos
- Repo: pypa/gh-action-pip-audit
- Repo: pypa/gh-action-pypi-publish
- Repo: pypa/packaging.python.org
- Repo: pypa/pip-audit
- Repo: pypa/twine
- Repo: pypi/pypi-attestations
- By facutuesca
- #82: Add
pypi-attestations verify pypiCLI subcommand - #83: chore: prep 0.0.21
- #86: cli: Support verifing
*.slsa.attestationattestation files - #87: cli: Support friendlier syntax for
verify pypicommand - #98: Support local files in
verify pypisubcommand - #103: Simplify test assets and include them in package
- #104: Add API and CLI option for offline (no TUF refresh) verification
- #105: Add CLI subcommand to convert Sigstore bundles to attestations
- #119: Add pull request template
- #120: Update license fields in pyproject.toml
- #128: chore: prep v0.0.27
- #145: chore: prep v0.0.28
- #151: Fix lint and remove support for Python 3.9
- #150: Add cooldown to dependabot updates
- #152: Add zizmor to CI
- #153: Remove unneeded permissions from zizmor workflow
- #82: Add
- By woodruffw
- #94: _cli:
make reformat - #99: chore: prep v0.0.22
- #109: bugfix: impl: require at least one of the source ref/sha extensions
- #110: pypi_attestations: bump version to 0.0.23
- #114: feat: add support for Google Cloud-based Trusted Publishers
- #115: chore: prep for release v0.0.24
- #118: chore: release: v0.0.25
- #122: chore(ci): uvx gha-update
- #124: fix: remove ultranormalization of distribution filenames
- #125: chore: prep for release v0.0.26
- #127: bugfix: compare distribution names by parsed forms
- #94: _cli:
- By facutuesca
- Repo: pypi/warehouse
- By DarkaMaul
- By facutuesca
- #17391: docs: add details of how to verify provenance JSON files
- #17438: Add archived badges to project’s settings page
- #17484: Add blog post for archiving projects
- #17532: Simplify archive/unarchive UI buttons
- #17405: Improve error messages when a pending Trusted Publisher’s project name already exists
- #17576: Check for existing Trusted Publishers before constraining existing one
- #18168: Add workaround in dev docs for issue with OpenSearch image
- #18221: chore(deps): bump pypi-attestations from 0.0.26 to 0.0.27
- #18169: oidc: Refactor lookup strategies into single functions
- #18338: oidc: fix bug when matching GitLab environment claims
- #18884: Update URL for
pypi-attestationsrepository - #18888: Update
pypi-attestationstov0.0.28
- By woodruffw
- #17453: history: render project archival enter/exit events
- #17498: integrity: refine Accept header handling
- #17470: metadata: initial PEP 753 bits
- #17514: docs/api: clean up Upload API docs slightly
- #17571: profile: add archived projects section
- #17716: docs: new and shiny storage limit docs
- #17913: requirements: bump pypi-attestations to 0.0.23
- #18113: chore(docs): add social links for Mastodon and Bluesky
- #18163: docs(dev): add meta docs on writing docs
- #18164: docs: link to PyPI user docs more
- Repo: python/peps
- Repo: sigstore/architecture-docs
- Repo: sigstore/community
- Repo: sigstore/cosign
- Repo: sigstore/fulcio
- Repo: sigstore/gh-action-sigstore-python
- Repo: sigstore/protobuf-specs
- Repo: sigstore/rekor
- Repo: sigstore/rekor-monitor
- By facutuesca
- #685: Fix Makefile and README
- #689: Make CLI args for configuration path/string mutually exclusive
- #688: Add support for CT log entries with Precertificates
- #695: Fetch public keys using TUF
- #705: Initial support for Rekor v2
- #729: Handle sharding of Rekor v2 log while monitor runs
- #752: Use
int64for index types - #751: Add identity monitoring for Rekor v2
- #827: Add cooldown to dependabot updates
- #828: Update codeql-action
- By ret2libc
- #717: ci: wrap inputs.config in ct_reusable_monitoring
- #718: doc: correct usage of ct log monitoring workflow
- #724: pkg/rekor: handle signals inside long op GetEntriesByIndexRange
- #723: Deduplicate ct/rekor monitoring reusable workflows
- #725: Refactor IdentitySearch logic between ct and rekor
- #726: Deduplicate ct and rekor monitors
- #727: Fix once behaviour
- #730: cmd/rekor_monitor: accept custom TUF
- #736: pkg/notifications: make Notifications more customazible
- #739: Add a few tests for the main monitor loop
- #742: internal/cmd/common_test: fix TestMonitorLoop_BasicExecution
- #741: Add config validation
- #743: Fix monitor loop behaviour when using once without a prev checkpoint
- #738: Report failed entries
- #745: internal/cmd: fix common tests after merging
- #740: Split the consistency check and the checkpoint writing
- #746: cmd: fix WriteCheckpointFn when no previous checkpoint
- #748: Small refactoring
- #749: internal/cmd: Use interface instead of callbacks
- #750: internal/cmd: remove unused MonitorLoopParams struct
- #763: pkg/util/file: write only one checkpoint
- #764: Add trusted CAs for filtering matched identities
- #771: Fix bug with missing entries when regex were used
- #773: pkg/identity: simplify CreateMonitoredIdentities function
- #770: Check Certificate chain in CTLogs
- #777: Refactor IdentitySearch args
- #776: ci: add release workflow
- #778: Parsable output
- #786: Improve README by explaining config file
- By facutuesca
- Repo: sigstore/rekor-tiles
- Repo: sigstore/sigstore
- Repo: sigstore/sigstore-conformance
- Repo: sigstore/sigstore-go
- Repo: sigstore/sigstore-python
- By woodruffw
- Repo: sigstore/sigstore-rekor-types
- Repo: synacktiv/DepFuzzer
- Repo: wolfv/ceps
Others
- Repo: AzureAD/microsoft-authentication-extensions-for-python
- Repo: SchemaStore/schemastore
- Repo: google/gvisor
- Repo: oli-obk/cargo_metadata
- Repo: ossf/alpha-omega
- Repo: rustsec/advisory-db
