Please report security issues privately to osscontact@163.com. Do not open
public issues for security problems.
We will acknowledge reports within 5 business days.
HALF is designed for single-tenant self-hosting. The deployment model assumes:
- The administrator and users all belong to the same organization.
- At the application layer, business resources are owner-scoped. Regular users cannot access each other's projects, agents, plans, tasks, or polling records. Administrators use separate management surfaces, but application APIs do not depend on administrators taking over user-owned projects.
- At the deployment layer, the administrator or host operator is fully trusted: they can access the HALF database, repository clones, container volumes, host filesystem mounts, and git remotes configured for HALF.
- Process templates are shared resources: all logged-in users can list, view, and use templates, while only the creator or an administrator can update or delete them.
HALF is not suitable for hosting untrusted users.
In scope:
- SSRF via user-supplied git URLs.
src/backend/validators/git_url.pyrejectsfile://,ext::, injection-prefix strings, loopback/private network hosts, and the AWS metadata IP. - Weak default credentials. The backend refuses to start when
HALF_STRICT_SECURITY=trueand eitherHALF_SECRET_KEYorHALF_ADMIN_PASSWORDis weak. This is the default in the bundleddocker-compose.yml. - Open registration. Self-registration is off by default
(
HALF_ALLOW_REGISTER=false). When enabled for demo deployments, the server assignsrole=userand ignores client-supplied role / status fields. - Login brute force. A per-username rate limiter is applied in
src/backend/middleware/rate_limit.py.
Out of scope in v0.x:
- Hardened multi-tenant isolation
- Supply-chain attestation of installed dependencies
- Formal cryptographic review
Before exposing HALF beyond localhost:
- Set
HALF_SECRET_KEYto a value generated withpython3 -c 'import secrets; print(secrets.token_urlsafe(48))'. - Set
HALF_ADMIN_PASSWORDto a value that is at least 8 characters long and contains uppercase, lowercase, and digits. - Leave
HALF_STRICT_SECURITY=trueandHALF_ALLOW_REGISTER=falseunless you have a reason to change them. - Do not mount your host
~/.sshdirectory into the container. Use a dedicated deploy key viadocker-compose.override.yml. - Put HALF behind a reverse proxy that terminates TLS.
HALF_CORS_ORIGINS defaults to local development origins only. Set it
explicitly in production.