Kurniadi Ahmad Wijaya
Forward Deployed AI Engineer
AI and software built for the demands of banking, fintech and enterprise.
Technical Consultant, Software & AI · Metrodata (PT Mitra Integrasi Informatika)
Skip to content

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. 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. 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. 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. 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. 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.

    Fraud Review Dashboard and Security Remediation

  • 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.

    Fraud Review Dashboard and Security Remediation

  • 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.

    AI Fraud Document Review

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.

    628 PRs security-scanned

    Read the case study

  • Vulnerability Scanning Automation

    Scheduled vulnerability scans, asset ownership and remediation reports, so each finding reaches the team that owns the asset.

    Compared between scans every 15 minutes

    Read the case study

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. 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. 2

    Secret scanning

    gitleaks in CI on 8 repositories, plus a local pre-commit hook that uses the same pinned, checksum-verified binary.

  3. 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. 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. 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. 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. 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. 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. 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. 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)