| Version | Status |
|---|---|
| 0.7.x | Current — supported with security fixes |
| 0.6.x | Security fixes only while 0.7.x is the current series |
| < 0.6 | Not supported |
Do NOT open a public issue for security vulnerabilities.
To report a vulnerability, use one of these private channels:
- Email:
security@turbolang.dev - GitHub: Private vulnerability reporting
Please include:
- A clear description of the issue and its impact
- A minimal reproducer (a
.tbsource file is ideal) - The affected version (
turbolang --version) - Your assessment of severity, if you have one
- Acknowledgment: within 48 hours of receipt
- Critical fixes: target 7 days from acknowledgment
- Non-critical fixes: rolled into the next scheduled release
You will be kept informed of progress and credited (unless you request anonymity) once a fix ships.
In scope:
- The Turbo compiler (
turbo-cli,turbo-parser,turbo-sema,turbo-codegen-cranelift) - The C runtime (
turbo/crates/turbo-codegen-cranelift/runtime/turbo_rt.c) - The LSP server (
turbo-lsp) - The install script and Homebrew formula
- Any feature documented as stable in
README.mdordocs/
Out of scope:
- Experimental features explicitly flagged in
CHANGELOG.mdas unstable or experimental (currently: the WASM target and the LLVM backend). Agent/tool language primitives are not shipped — and are not planned for the core — so they are out of scope by omission, not by experiment - Crashes triggered only by
@unsafecode or raw pointer arithmetic — by design these bypass safety checks - Issues in third-party dependencies (please report upstream)
The following are documented limitations rather than vulnerabilities;
fixing them is tracked in CHANGELOG.md and TODO.md:
- HTTP server primitives are experimental.
http_server/http_listenare intended for development and demos. They are not hardened for direct exposure to untrusted networks. As of v0.5.1 the default bind is127.0.0.1; the explicithttp_server_public(port)opt-in binds0.0.0.0. Always put a reverse proxy (nginx, Caddy) in front of a public deployment. - No reference counting yet.
rt_releaseis currently a no-op, so long-running services leak memory at allocation rate (~2.5 KB per request on the example HTTP server). Real ARC is planned for v0.6 — seeTODO.md. - Compiled binaries run with full system privileges. Turbo has no
capability/sandbox model. Treat compiled
.tbprograms the same way you would any compiled C program.
Every release tarball is published alongside a checksums.txt file
listing SHA-256 hashes for each platform artifact. Stable releases also
ship a detached GPG signature for that manifest (checksums.txt.sig).
The manifest is signed by the official Turbo release key, published at:
- Release key URL:
https://turbolang.dev/keys/release.asc
The release automation that builds, signs, and publishes those artifacts is pinned to immutable GitHub Action SHAs in:
.github/workflows/ci.yml.github/workflows/release.yml.github/workflows/nightly.yml
This reduces supply-chain drift in CI itself: action upgrades are now explicit code changes instead of silent tag movement.
To verify a download manually:
# 1. Import the public release key (one-time setup).
curl -sSL https://turbolang.dev/keys/release.asc | gpg --import
# 2. Verify the manifest signature.
gpg --verify checksums.txt.sig checksums.txt
# Expect: "Good signature from Turbo Language Releases <release@turbolang.dev>"
# 3. Verify the tarball you downloaded matches the signed manifest.
sha256sum --check --ignore-missing checksums.txtIf gpg --verify reports anything other than Good signature, stop
and report it to security@turbolang.dev — do not install the binary.
The release private key lives only in GitHub Actions secrets
(RELEASE_GPG_PRIVATE_KEY + RELEASE_GPG_PASSPHRASE) and is used by
.github/workflows/release.yml. If the key is rotated, the new public
key replaces the file at https://turbolang.dev/keys/release.asc and a
release advisory is published to announce the rotation.
distribution/install.sh --verify now performs the same signed-manifest
flow automatically:
- Download the requested tarball,
checksums.txt, andchecksums.txt.sigfrom the GitHub release. - Download the release public key from
https://turbolang.dev/keys/release.ascinto a temporary GnuPG home. - Verify that
checksums.txt.sigmatcheschecksums.txt. - Verify that the tarball hash matches the signed manifest entry.
This is materially stronger than checksum-only verification because a modified tarball now also needs a forged manifest signature.
The convenience installer still has one unavoidable bootstrap
assumption: on first use it trusts HTTPS/DNS for turbolang.dev when it
retrieves the public release key. That is better than pulling the key
from the same GitHub release channel as the tarball, but it is still a
network trust dependency.
If you want the strongest assurance available today:
- Import the release key yourself ahead of time from a channel you trust.
- Run the manual
gpg --verifyflow above before extracting the tarball. - Prefer vendoring the release key in internal build/install systems instead of fetching it at install time.
We follow coordinated disclosure. Once a fix is released, we publish a brief advisory describing the issue, affected versions, the fix, and credit to the reporter (unless anonymity was requested).