rein-openhands
A deterministic, no-LLM SecurityAnalyzer for OpenHands, backed by the rein engine.
OpenHands' built-in LLMSecurityAnalyzer asks the model to grade its own
actions. This grades them with rein instead. Before an action runs, rein reviews
the code or command it would write for leaked secrets, unsafe code, and slop, and
returns a SecurityRisk that feeds OpenHands' ConfirmRisky policy. No model in
the loop, so the same action gets the same verdict every time.
Install
pip install rein-openhands
It pulls in rein-engine and openhands-sdk.
Use
Security analyzers are configured on the conversation, with a confirmation policy:
from openhands.sdk import Conversation
from openhands.sdk.security import ConfirmRisky, SecurityRisk
from rein_openhands import ReinSecurityAnalyzer
conversation = Conversation(agent=agent, workspace=".")
conversation.set_security_analyzer(ReinSecurityAnalyzer())
conversation.set_confirmation_policy(ConfirmRisky(threshold=SecurityRisk.HIGH))
That is all. See the OpenHands docs for agent and conversation setup.
What it flags
rein judges the content of the action. It returns HIGH for, among others:
- unsafe code execution:
os.system,subprocesswithshell=True,eval,exec - unsafe deserialization and loaders:
pickle.loads,yaml.load,marshal.loads - unverified TLS context:
ssl._create_unverified_context - hard-coded credentials: AWS, Stripe, GitLab, SendGrid, npm and similar keys
Some weaker risks map to MEDIUM, for example weak hashes (md5/sha1) and
requests(..., verify=False). Lint, style, and slop map to MEDIUM/LOW. The
exact rule set is rein's, so it grows with the engine.
Fail closed on unparseable code
If a .py action cannot be parsed, rein's AST-based security checks cannot run,
so the code is unanalyzed rather than safe. In that case the analyzer returns
HIGH instead of letting the result downgrade to the syntax error's own level.
"Cannot analyze this code" must not read as "this code is safe." The rule is
scoped to .py, so a non-Python command or a text file is left to its normal
verdict.
Use alongside other analyzers
This is the code-content layer. It does not authorize actions or inspect shell command patterns. Run it together with OpenHands' action and shell-pattern checks for defense in depth; rein answers "is the code being written dangerous," the others answer "is this action allowed to run."
Policy as data (roadmap)
The rein engine already externalizes its decision rules as data: a .rein.toml
declares the verdict policy (fail_at, per-category thresholds), rule disables,
and custom regex rules, so a maintainer can declare what is blocked without
writing code. This analyzer does not yet read that config (it maps rein's finding
severities to SecurityRisk directly); honoring a repo's .rein.toml here so the
policy governs the verdict is the next planned step. See the rein docs for the
config format.
License
Apache-2.0. See LICENSE.
Metadata
Release files for rein-openhands 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| rein_openhands-0.3.0.tar.gz | 10.9 kB | With provenance | Details for rein_openhands-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| rein_openhands-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for rein_openhands-0.3.0-py3-none-any.whl |
Total release size: 19.8 kB
Release files / rein_openhands-0.3.0.tar.gz
| Download URL | rein_openhands-0.3.0.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ac65cd3443aec23901e3b6e006a63e01d988e6cf6c7a12e7d5e88744c695f61d
|
|
BLAKE2b-256 checksum How to use checksums |
e63b77e094945cd50c3b3551b7c7783935564552c26ba5721dbb3e0cdb713aa1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logRelease files / rein_openhands-0.3.0-py3-none-any.whl
| Download URL | rein_openhands-0.3.0-py3-none-any.whl |
|---|---|
| Size | 8.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
01250938a17ea68fe3481d5a46cb2881eeb7ccc3db6086d19ae9b5b29e604848
|
|
BLAKE2b-256 checksum How to use checksums |
2c945b98291f686d921cff9eedabae0c41e53cd82aff17b4f75f0de9a638a9a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logSecurity for rein-openhands 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for rein_openhands-0.3.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.