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, private agents, plans, tasks, or polling records. Agents created by administrators form a public agent pool: active public agents are visible and usable by all logged-in users, but only the administrator who created a public agent can modify, disable, reset, or delete it. Administrators cannot view or take over regular users' private agents. 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.