If you discover a security vulnerability in OphirPay, please do not open a public issue.
Instead, email security@ophirpay.com with:
- A description of the vulnerability
- Steps to reproduce
- Affected versions
- Any potential mitigations
We will respond within 48 hours and work with you on a fix.
Email security@ophirpay.com with the following information:
- Subject:
[SECURITY] Brief description of the vulnerability - Body:
- Description of the vulnerability
- Steps to reproduce (include URLs, endpoints, and request/response examples if applicable)
- Affected versions (check
package.jsonorCargo.toml) - Potential impact (what an attacker could achieve)
- Any suggested mitigations (if you have them)
- Your preferred contact method for follow-up questions
We will acknowledge receipt of your report within 48 hours via email.
Our security team will validate the vulnerability within 5 business days. We may contact you for additional details or clarification.
Once validated, we will:
- Develop and test a fix
- Deploy the fix to production
- Publish a security advisory on GitHub
- Credit you in the advisory (unless you prefer anonymity)
If eligible, you will receive a reward based on the severity of the vulnerability (see Bug Bounty Program below).
OphirPay publishes a security.txt file at /.well-known/security.txt following the RFC 9116 standard. This file provides security researchers with contact information and disclosure policies.
The file is accessible at:
- Production: https://ophirpay.vercel.app/.well-known/security.txt
- Repository: https://github.com/OphirPay/OphirPay/blob/main/.well-known/security.txt
- OphirPay never stores private keys — all signing happens client-side via Freighter
- Always verify the destination address before signing
- Check transaction details in Freighter before approving
- Use a hardware wallet for production/mainnet operations
- Never share your wallet seed phrase or private keys
- Run
npm auditregularly to check for dependency vulnerabilities - Keep all dependencies up to date
- Review PRs for security implications
- Never commit secrets or API keys
- Use environment variables for all sensitive configuration
- Follow the principle of least privilege
- Validate all user inputs server-side
| Version | Supported |
|---|---|
| 1.0.x | ✅ Active (current) |
| 0.1.x |
OphirPay offers rewards for responsibly disclosed vulnerabilities:
| Severity | Reward | Examples |
|---|---|---|
| Critical (9.0-10.0) | Up to $5,000 | Fund drainage, unauthorized admin takeover, key extraction |
| High (7.0-8.9) | Up to $2,000 | Reentrancy, signature bypass, privilege escalation |
| Medium (4.0-6.9) | Up to $500 | CSRF on sensitive endpoints, information disclosure, DoS |
| Low (0.1-3.9) | Swag + recognition | Minor issues, defense-in-depth improvements |
- Smart contracts:
contracts/ophirpay/src/lib.rs,contracts/emitter/src/lib.rs - API routes:
src/app/api/**/route.ts - Authentication: Wallet session auth, API key auth
- Webhook system: URL validation, HMAC signing, SSRF prevention
- Infrastructure: Dockerfile, Kubernetes manifests, Helm chart
- Frontend: Next.js application, wallet integration
- Denial of service attacks against the infrastructure
- Social engineering attacks
- Attacks requiring physical access to user devices
- Issues in third-party dependencies (report these to the respective maintainers)
- Issues already reported by someone else
- Do not exploit the vulnerability beyond what is necessary to demonstrate it
- Do not access, modify, or delete other users' data
- Do not disrupt the live service (ophirpay.vercel.app)
- Do not disclose the vulnerability publicly before it is resolved
- Provide a clear proof-of-concept with steps to reproduce
- Report vulnerabilities in good faith
- Email security@ophirpay.com with your report
- We acknowledge within 48 hours
- We validate and determine severity within 5 business days
- We ship a fix and publish an advisory
- You receive credit in the advisory + reward
Payouts are in XLM or USDC on Stellar. We follow CVSS v3.1 scoring.
OphirPay implements the following security headers:
X-Content-Type-Options: nosniffX-Frame-Options: DENYReferrer-Policy: strict-origin-when-cross-originX-XSS-Protection: 1; mode=blockPermissions-Policy: camera=(), microphone=(), geolocation=()
- All contract functions use proper access control
- Cross-contract calls are validated
- Contracts use Result types for error handling
- Timestamps and metadata are recorded for audit trails
- Reentrancy guards protect all token transfer paths
- Emergency pause functionality available for circuit breaking
- CSRF protection with double-submit cookie pattern
- HMAC-SHA256 signed session cookies
- API keys hashed at rest with SHA-256
- SSRF protection for webhook URLs
- Input validation with Zod schemas
- Rate limiting (120 RPM default)
- CSP headers with Stellar-only connect-src
OphirPay runs an automated dependency vulnerability scan that fails the build on advisories rated high or critical.
- Runs on every pull request and on a nightly schedule (
.github/workflows/dependency-scan.yml), plus on demand viaworkflow_dispatch. - Uses
npm audit --jsonviascripts/audit-dependencies.mjs. - Uploads the full audit report (
dependency-audit-report/) as a CI artifact on every run — including passes — so findings are reviewable. - Fails (exit 1) when any un-suppressed advisory is at/above
AUDIT_FAIL_ON(defaulthigh, i.e. high + critical). - Treats an un-scannable dependency tree (registry outage, malformed output) as a scan failure — a broken scan must not silently pass.
A maintainer may document an accepted risk by adding an entry to .github/dependency-suppressions.json. Suppressions are only acceptable when all of the following hold:
- No fix is available — the vulnerable package has no patched release, and no compatible upgrade path exists (e.g. the maintainer still pins the vulnerable range).
- Limited exposure — the vulnerable code path is dev-only tooling (e.g. the Prisma CLI) or otherwise not reachable from the app runtime / production attack surface.
- Justified and tracked — the entry records a reason, an expiry date, and a tracking link (advisory URL).
- Reviewed — the entry is added by a maintainer in a reviewed PR, not silently.
Suppressions are temporary: the policy is to re-check each suppressed advisory when it expires (or when a fix ships upstream) and upgrade then. New advisories are never suppressed by an existing entry — each finding must be covered by its own entry.
npm ci
node scripts/audit-dependencies.mjs # fails on high/critical (default)
AUDIT_FAIL_ON=critical node scripts/audit-dependencies.mjs # critical onlyThe JSON report lands in dependency-audit-report/.
- Security Email: security@ophirpay.com
- GitHub Issues: For non-security bugs only
- General Questions: GitHub Discussions
We will not take legal action against researchers who follow this responsible disclosure policy. We consider security research conducted in accordance with this policy to be authorized and will not pursue legal action for accidental, good-faith violations.
Last updated: August 2026