<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>Adeyemi Folarin · Security Research</title>
	<subtitle>Cybersecurity research, exploit analysis, proof of concepts, and code reviews.</subtitle>
	<link href="https://blog.adeyemi.xyz/feed.xml" rel="self"/>
	<link href="https://blog.adeyemi.xyz/"/>
	<id>https://blog.adeyemi.xyz/</id>
	<updated>2026-10-13T00:00:00Z</updated>
	<author><name>Adeyemi Folarin</name></author>
	<entry>
		<title>One Long Key: How 200 KB of TOML Kills a Node Process</title>
		<link href="https://blog.adeyemi.xyz/blog/toml-node-quadratic-dotted-keys"/>
		<id>https://blog.adeyemi.xyz/blog/toml-node-quadratic-dotted-keys</id>
		<published>2026-10-13T00:00:00Z</published>
		<updated>2026-10-13T00:00:00Z</updated>
		<summary>toml for npm rebuilt every dotted key's full path at every segment, so one long key cost O(n²) time and memory. A 100 KB key froze the event loop for 6.8 seconds, and around 200 KB crashed Node with an out-of-memory error that try/catch can't stop. GHSA-9j65-hcg3-gc64, fixed in 5.0.1.</summary>
		<category term="toml"/>
		<category term="nodejs"/>
		<category term="denial-of-service"/>
		<category term="algorithmic-complexity"/>
		<category term="cwe-407"/>
		<category term="responsible-disclosure"/>
	</entry>
	<entry>
		<title>Curly Braces Around a Table Name Skipped Trigger.dev's Tenant Filter</title>
		<link href="https://blog.adeyemi.xyz/blog/trigger-dev-tsql-placeholder-tenant-bypass"/>
		<id>https://blog.adeyemi.xyz/blog/trigger-dev-tsql-placeholder-tenant-bypass</id>
		<published>2026-10-08T00:00:00Z</published>
		<updated>2026-10-08T00:00:00Z</updated>
		<summary>Trigger.dev runs background jobs and AI agents for more than 30,000 developers. Its query API adds an organization filter to each table, but a table name in {braces} skipped it, so any API key could read the rows of all tenants. The fix shipped in 4.7.3, one day after my report.</summary>
		<category term="trigger-dev"/>
		<category term="multi-tenant"/>
		<category term="sql-injection"/>
		<category term="cwe-863"/>
		<category term="clickhouse"/>
		<category term="web-security"/>
	</entry>
	<entry>
		<title>One Email Leaks the DB Password, One GET Takes the ERP Down</title>
		<link href="https://blog.adeyemi.xyz/blog/facturascripts-sendmail-traversal-deploy-token"/>
		<id>https://blog.adeyemi.xyz/blog/facturascripts-sendmail-traversal-deploy-token</id>
		<published>2026-10-05T00:00:00Z</published>
		<updated>2026-10-05T00:00:00Z</updated>
		<summary>Two FacturaScripts advisories, same product, same day. A path traversal in the mail attachment handler emails config.php to an attacker (CVSS 9.9). A Deploy endpoint signed with md5 of the database password lets anyone disable every plugin (CVSS 7.5). The first bug hands you the key to the second.</summary>
		<category term="facturascripts"/>
		<category term="path-traversal"/>
		<category term="erp"/>
		<category term="cwe-22"/>
		<category term="cwe-330"/>
		<category term="web-security"/>
	</entry>
	<entry>
		<title>What I learned from a seven-challenge CTF (and the one flag I missed)</title>
		<link href="https://blog.adeyemi.xyz/blog/flash-ctf-seven-challenges-six-flags"/>
		<id>https://blog.adeyemi.xyz/blog/flash-ctf-seven-challenges-six-flags</id>
		<published>2026-09-26T00:00:00Z</published>
		<updated>2026-09-26T00:00:00Z</updated>
		<summary>Notes from SkillBit's Flash CTF: seven challenges across forensics, reversing, web and misc. Six of them fell in a few minutes each, and the seventh taught me something, because my registry parser was a leaky abstraction over the evidence and it leaked silently.</summary>
		<category term="ctf"/>
		<category term="ctf-writeup"/>
		<category term="forensics"/>
		<category term="windows-registry"/>
		<category term="registry-transaction-log"/>
		<category term="reverse-engineering"/>
		<category term="web-security"/>
	</entry>
	<entry>
		<title>The DNS check that passed and the connection that didn't care</title>
		<link href="https://blog.adeyemi.xyz/blog/mcp-from-openapi-ssrf-dns-toctou"/>
		<id>https://blog.adeyemi.xyz/blog/mcp-from-openapi-ssrf-dns-toctou</id>
		<published>2026-09-26T00:00:00Z</published>
		<updated>2026-09-26T00:00:00Z</updated>
		<summary>mcp-from-openapi added an SSRF guard to protect internal services and cloud metadata. It resolved the hostname once to validate it, and then called fetch(), which re-resolved it at connection time. How a classic DNS TOCTOU slips into modern async JavaScript, why blocklist hardening can't fix it, and what it actually takes to pin a socket.</summary>
		<category term="security"/>
		<category term="ssrf"/>
		<category term="dns-rebinding"/>
		<category term="mcp"/>
		<category term="nodejs"/>
		<category term="vulnerability"/>
	</entry>
	<entry>
		<title>A Where Is Not a Yes: Payload Alt Text Health Report Leaked Every Tenant's Counts</title>
		<link href="https://blog.adeyemi.xyz/blog/payload-alt-text-health-row-level-bypass"/>
		<id>https://blog.adeyemi.xyz/blog/payload-alt-text-health-row-level-bypass</id>
		<published>2026-09-23T00:00:00Z</published>
		<updated>2026-09-23T00:00:00Z</updated>
		<summary>The alt text health report in @jhb.software/payload-alt-text-plugin scanned every tenant with overrideAccess: true and flattened Where-based read rules to a yes, handing any logged-in user counts and up to 100 document IDs from rows they cannot read. GHSA-3pmw-vxv3-8vgq, CVSS 4.3, fixed in 0.13.0.</summary>
		<category term="payload-cms"/>
		<category term="access-control"/>
		<category term="multi-tenant"/>
		<category term="cwe-863"/>
		<category term="security-research"/>
	</entry>
	<entry>
		<title>Argos CLI Debug Mode Prints Your CI Tokens, and the Docs Tell You to Enable It</title>
		<link href="https://blog.adeyemi.xyz/blog/argos-debug-mode-leaks-ci-tokens"/>
		<id>https://blog.adeyemi.xyz/blog/argos-debug-mode-leaks-ci-tokens</id>
		<published>2026-09-13T00:00:00Z</published>
		<updated>2026-09-13T00:00:00Z</updated>
		<summary>Two advisories I filed against argos-javascript: the documented debug flag dumps GITHUB_TOKEN and ARGOS_TOKEN into CI logs, and the OAuth login echoes attacker-controlled ANSI into your terminal. Both fixed within a day.</summary>
		<category term="argos"/>
		<category term="github-actions"/>
		<category term="ci-cd"/>
		<category term="secrets"/>
		<category term="security-research"/>
	</entry>
	<entry>
		<title>Kimai Guarded the Report and Forgot the Export</title>
		<link href="https://blog.adeyemi.xyz/blog/kimai-export-authorization-bypass"/>
		<id>https://blog.adeyemi.xyz/blog/kimai-export-authorization-bypass</id>
		<published>2026-08-17T00:00:00Z</published>
		<updated>2026-08-17T00:00:00Z</updated>
		<summary>Kimai locked its project report behind a permission check and left the export route beside it open. Any logged-in user could download customer names, project names, and budget metadata across every customer. Advisory GHSA-pvc4-crg3-gj44, CVE-2026-80194, patched in 2.64.0.</summary>
		<category term="kimai"/>
		<category term="access-control"/>
		<category term="broken-authorization"/>
		<category term="symfony"/>
		<category term="cwe-862"/>
		<category term="web-security"/>
	</entry>
	<entry>
		<title>Why Can't We Agree on What a Passkey Is?</title>
		<link href="https://blog.adeyemi.xyz/blog/fourteen-names-for-a-passkey"/>
		<id>https://blog.adeyemi.xyz/blog/fourteen-names-for-a-passkey</id>
		<published>2026-07-07T00:00:00Z</published>
		<updated>2026-07-07T00:00:00Z</updated>
		<summary>One credential has 14 names because three standards bodies and a marketing coalition all held authority to name it and none held authority to stop. The passkey vocabulary mess is a governance problem, not a spelling one.</summary>
		<category term="passkeys"/>
		<category term="webauthn"/>
		<category term="fido2"/>
		<category term="authentication"/>
		<category term="identity"/>
		<category term="standards"/>
	</entry>
	<entry>
		<title>One Boolean and You Vanish: A Mass Assignment Fix in Kimai</title>
		<link href="https://blog.adeyemi.xyz/blog/kimai-systemaccount-mass-assignment"/>
		<id>https://blog.adeyemi.xyz/blog/kimai-systemaccount-mass-assignment</id>
		<published>2026-07-07T00:00:00Z</published>
		<updated>2026-07-07T00:00:00Z</updated>
		<summary>A ROLE_TEAMLEAD user in Kimai 2.56.0 could set systemAccount:true on their own profile through the user API and disappear from every billing report, every user dropdown, and every teammate's view. One missing permission check. Patched in 2.57.0, credit in the release notes.</summary>
		<category term="kimai"/>
		<category term="mass-assignment"/>
		<category term="cwe-915"/>
		<category term="access-control"/>
		<category term="responsible-disclosure"/>
		<category term="web-security"/>
	</entry>
	<entry>
		<title>732 Bytes to Root: Copy Fail Just Broke Every Linux Distro Since 2017</title>
		<link href="https://blog.adeyemi.xyz/blog/copy-fail-732-bytes-to-root"/>
		<id>https://blog.adeyemi.xyz/blog/copy-fail-732-bytes-to-root</id>
		<published>2026-04-30T00:00:00Z</published>
		<updated>2026-04-30T00:00:00Z</updated>
		<summary>CVE-2026-31431 is a logic bug in the Linux kernel's crypto API that gives any local user root through a 732-byte Python script. No race conditions, no kernel offsets, no recompilation. Same script, every distro, every time. It's been sitting there for nine years.</summary>
		<category term="linux"/>
		<category term="kernel"/>
		<category term="lpe"/>
		<category term="privilege-escalation"/>
		<category term="af-alg"/>
		<category term="cve-2026-31431"/>
		<category term="page-cache"/>
		<category term="container-escape"/>
	</entry>
	<entry>
		<title>Five CVEs in Tryton ERP: Stored XSS, Broken Access Controls, and Server Info Leaks</title>
		<link href="https://blog.adeyemi.xyz/blog/tryton-erp-five-cves-one-audit"/>
		<id>https://blog.adeyemi.xyz/blog/tryton-erp-five-cves-one-audit</id>
		<published>2026-03-08T00:00:00Z</published>
		<updated>2026-03-08T00:00:00Z</updated>
		<summary>Five CVEs disclosed in Tryton ERP through responsible disclosure -- stored XSS that escalates to unauthenticated via email, access control bypasses on data exports, and stack traces handed to any logged-in user. All patched, all basic, all in production for years.</summary>
		<category term="xss"/>
		<category term="erp"/>
		<category term="tryton"/>
		<category term="cve-2025-66420"/>
		<category term="cve-2025-66421"/>
		<category term="cve-2025-66422"/>
		<category term="access-control"/>
	</entry>
	<entry>
		<title>The AI Wars Are Here: How DeepSeek, Moonshot, and MiniMax Stole 16 Million Conversations from Claude</title>
		<link href="https://blog.adeyemi.xyz/blog/ai-distillation-wars-anthropic-deepseek"/>
		<id>https://blog.adeyemi.xyz/blog/ai-distillation-wars-anthropic-deepseek</id>
		<published>2026-02-23T00:00:00Z</published>
		<updated>2026-02-23T00:00:00Z</updated>
		<summary>Anthropic caught three Chinese AI labs running coordinated model distillation attacks at scale. 24,000 fraudulent accounts, 16 million stolen exchanges, and capabilities extraction targeting AI safety research and censorship circumvention. The AI cold war just went hot.</summary>
		<category term="ai"/>
		<category term="distillation"/>
		<category term="deepseek"/>
		<category term="llm"/>
		<category term="model-theft"/>
		<category term="security"/>
		<category term="anthropic"/>
	</entry>
	<entry>
		<title>Three Lines of Dockerfile to Root: Breaking Out of 37% of Cloud Environments</title>
		<link href="https://blog.adeyemi.xyz/blog/container-escape-three-lines-to-root"/>
		<id>https://blog.adeyemi.xyz/blog/container-escape-three-lines-to-root</id>
		<published>2026-01-06T00:00:00Z</published>
		<updated>2026-01-06T00:00:00Z</updated>
		<summary>CVE-2025-23266 (NVIDIAScape) lets you escape Docker containers and get root on the host with a 3-line Dockerfile. Affects NVIDIA Container Toolkit used by 37% of cloud environments. Plus runc CVEs that break Kubernetes isolation.</summary>
		<category term="container-escape"/>
		<category term="docker"/>
		<category term="kubernetes"/>
		<category term="nvidia"/>
		<category term="runc"/>
		<category term="cve-2025-23266"/>
	</entry>
	<entry>
		<title>Trust Wallet's $7M Christmas Gift to Hackers: A Supply Chain Masterclass</title>
		<link href="https://blog.adeyemi.xyz/blog/trust-wallet-supply-chain-christmas-heist"/>
		<id>https://blog.adeyemi.xyz/blog/trust-wallet-supply-chain-christmas-heist</id>
		<published>2025-12-26T00:00:00Z</published>
		<updated>2025-12-26T00:00:00Z</updated>
		<summary>Trust Wallet's browser extension got backdoored via supply chain attack on Christmas Eve. Attackers pushed malicious code to production that drained $7M in user funds. Binance-owned wallet, developer negligence, APT-level execution.</summary>
		<category term="supply-chain"/>
		<category term="trust-wallet"/>
		<category term="apt"/>
		<category term="cryptocurrency"/>
		<category term="browser-extension"/>
	</entry>
	<entry>
		<title>$50M Gone in a Copy-Paste: Address Poisoning and Why Your Wallet's UX Is Garbage</title>
		<link href="https://blog.adeyemi.xyz/blog/address-poisoning-50m-usdt-loss"/>
		<id>https://blog.adeyemi.xyz/blog/address-poisoning-50m-usdt-loss</id>
		<published>2025-12-20T00:00:00Z</published>
		<updated>2025-12-20T00:00:00Z</updated>
		<summary>A victim loses $50 million USDT to an address poisoning attack because wallet developers can't be bothered to implement basic checksum validation. I demonstrate how trivial it is to generate matching addresses.</summary>
		<category term="cryptocurrency"/>
		<category term="address-poisoning"/>
		<category term="ux-security"/>
		<category term="ethereum"/>
		<category term="usdt"/>
	</entry>
	<entry>
		<title>React2Shell: Another Day, Another React Vulnerability (CVSS 10.0)</title>
		<link href="https://blog.adeyemi.xyz/blog/react2shell-cve-2025-55182"/>
		<id>https://blog.adeyemi.xyz/blog/react2shell-cve-2025-55182</id>
		<published>2025-12-15T00:00:00Z</published>
		<updated>2025-12-15T00:00:00Z</updated>
		<summary>React Server Components gets absolutely demolished by CVE-2025-55182. I demonstrate root RCE because apparently Meta's security team forgot about input validation.</summary>
		<category term="cve"/>
		<category term="react"/>
		<category term="rce"/>
		<category term="deserialization"/>
		<category term="pwned"/>
	</entry>
</feed>
