Security in Practice
I treat security as part of the design, not a checklist at the end: no keys to leak, the least access that works, and gates that run on every change. Here is what that closed, measured.
15 from 37
Open security findings on a production AI app in about two days, from 4 Critical and 8 High at the start
Same day
Leaked database key contained: every key rotated and the old one returns 401; the service went keyless within 24 hours
1 day
To patch the October 2026 Node.js security release across 12 repositories
How I secure applications
Five habits that show up in every project, from a public portfolio to enterprise AI products.
- 1
Keyless by default
Apps sign in to cloud services with a managed identity instead of an API key. A leaked config file then grants nothing, and there is no key to rotate.
- 2
Least privilege
Each identity gets only the data-plane roles it needs. Admin rights come from an allow-list keyed on the directory object ID, never from an email address or a sign-in alone.
- 3
Layered defenses for LLM features
Untrusted documents travel inside delimiters, get screened by Prompt Shields and must match a strict output schema. If a safety check did not run, the pipeline fails closed.
- 4
Security gates in CI
Secret scanning, dependency audits, static analysis and pinned actions run on every pull request, so a problem is caught before merge, not after release.
- 5
Recover fast
Secrets live in a vault with written rotation runbooks, so a leak is contained the same day and the fix is verified, not just assumed.
Keyless Azure
The AI, database, messaging and storage data planes of enterprise AI products, moved from API keys to managed identities.
7 repositories
Migrated from API keys to managed identity, each move recorded in its commits
6 repositories
Fully keyless in shipped infrastructure as code: local key auth turned off for AI services, databases, messaging and storage
3 repositories
Deploy from CI through GitHub OIDC federation only, with no stored cloud secret in the pipeline
Refuses to start
In production, an app refuses to start when a leftover key setting is present
The keyless flow
- Key Vault in RBAC mode with purge protection; every non-platform setting is a vault reference, and the app fails closed when one does not resolve.
- Release pipelines publish without any Azure role: a scoped registry push token and a policy-bound write link, with releases signed through OIDC.
- Web apps keep a TLS 1.2 floor with FTP and basic-auth publishing off, asserted at build time and read back from the live app.
AI and LLM security
LLM features read untrusted text, so they get their own tests, measured like any other result.
98.3% to 100%
Prompt-injection detection on a 96-case English and Indonesian test suite, run on every pull request
58 of 59 to 59 of 59 injection cases caught, across PDF, Word, Excel, CSV, text and image files; a synthetic evaluation set, not production traffic.
29 to 5
Uploaded-file analyses, of 98, that ran without safety screening, after the pipeline was made to fail closed
When the content filter or Prompt Shields does not run, the verdict is raised and the AI shortcuts are turned off.
11.1% to 3.7%
Prompt-injection success rate in a live evaluation, not production
Live evaluation after a model change on an AI fraud document review; these are evaluation results, not production outcomes.
Security products
Beyond securing my own work, I build tools that find and fix vulnerabilities for other teams.
AI Code Security Platform
Seven scanners on every pull request, AI triage, and fix pull requests that are rejected if they try to mute a scanner. Untrusted repositories are scanned in a sandbox.
Vulnerability Scanning Automation
Scheduled vulnerability scans, asset ownership and remediation reports, so each finding reaches the team that owns the asset.
Incidents handled
Told without the client, the service or a date finer than the month.
Old key: 401
Leaked database key contained the same day
All 4 keys rotated, all 9 credential settings moved to vault references and the backend locked to known callers. The database went keyless the next day.
Oct 2026
201 to 403
Privilege escalation closed
An admin could grant super-admin rights. That request is now refused with an audit record, and revoking the role ends the user's live sessions.
Nov 2026
12 of 12
12 confirmed findings fixed in one day
From a security review of a procurement platform, including a CI script injection and spreadsheet formula injection in exports.
Nov 2026
114 to 43
Vulnerabilities in a scanner image cut
Every bundled scanner binary bumped and checksum-verified. The fixable High and Critical CVEs that remain wait on upstream fixes.
Oct 2026
A+
Top security-header grade on a production web app
Nonce-based CSP, anti-clickjacking, no-store on sensitive responses and a generic error envelope. Mozilla Observatory: score 110, 12 of 12 tests passed.
Oct 2026
Supply chain and CI
What every change passes before it reaches production.
- 1
Actions pinned to commit SHAs
Every GitHub Action pinned to a full commit SHA in 8 repositories, so a moved tag cannot change what runs.
- 2
Secret scanning
gitleaks in CI on 8 repositories, plus a local pre-commit hook that uses the same pinned, checksum-verified binary.
- 3
Dependency gates
Dependabot updates, audits that block on High or above with a dated allow-list, and Semgrep static analysis triaged to an empty baseline.
- 4
Release gates
Digest-pinned base images, a Trivy gate, CycloneDX SBOMs and signed releases whose signature is checked at install.
How this site is secured
The same rules apply to this portfolio, and its source is public.
- 1
Strict content security policy
Every page carries its own script policy with SHA-256 hashes and no unsafe-inline, framing is denied, and an end-to-end test fails on any policy violation.
- 2
Transport and headers
HSTS for a year including subdomains, nosniff, a strict referrer policy and a Permissions-Policy that turns off the camera, microphone and location.
- 3
Ask Rover Assistant
Turnstile, rate limits of 8 a minute and 40 a day per salted visitor hash, a global daily cap, body size caps, PII scrubbing and signed conversation history.
- 4
Output checks on every answer
Answers are scanned for secrets, prompt leaks, defamation and numbers the sources do not support; links are allow-listed, and a nightly red-team evaluation runs against the assistant.
- 5
Agent Office privacy
The live office shows only an agent's state and activity; repository details appear only for allow-listed public repositories, and prompts, commands, paths or client names are never sent.
- 6
Locked-down CI and deploys
Actions pinned by SHA, gitleaks and Dependabot on every change; deploy secrets live only in a main-only environment and never reach pull request runs.
How this site was builtSource code on GitHub (opens in a new tab)
Background
Security started as a hobby: capture the flag competitions at university.
- Mar 20211st place · Foresty CTF Competition 2021 (Forensic and Security Laboratory)
- Feb 20203rd place · Capture the Flag Competition (Forensic and Security Laboratory)