<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Toolkit AI Reviews]]></title><description><![CDATA[Toolkit AI Reviews]]></description><link>https://toolkit-ai-reviews.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Toolkit AI Reviews</title><link>https://toolkit-ai-reviews.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 06:40:07 GMT</lastBuildDate><atom:link href="https://toolkit-ai-reviews.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Before You Grant an AI Agent Access: A Practical OAuth Scope Audit]]></title><description><![CDATA[Meta released **Muse**, a personal AI agent that asks for access to your email, calendars, payments and health data in order to do things for you — selling a car, booking travel. It competes with agen]]></description><link>https://toolkit-ai-reviews.hashnode.dev/before-you-grant-an-ai-agent-access-a-practical-oauth-scope-audit</link><guid isPermaLink="true">https://toolkit-ai-reviews.hashnode.dev/before-you-grant-an-ai-agent-access-a-practical-oauth-scope-audit</guid><category><![CDATA[AI]]></category><category><![CDATA[Security]]></category><category><![CDATA[oauth]]></category><dc:creator><![CDATA[孙永瑞]]></dc:creator><pubDate>Wed, 09 Sep 2026 10:25:14 GMT</pubDate><content:encoded><![CDATA[<p>Meta released **Muse**, a personal AI agent that asks for access to your email, calendars, payments and health data in order to do things for you — selling a car, booking travel. It competes with agents like OpenClaw and Instinct, and it pairs broad data requests with promises of privacy controls.</p>
<p>Whether Muse succeeds depends on whether people decide to trust Meta with that scope. That's a fair question but not the one I care about here. The useful question applies to every agent in this category, including the ones you'll be offered next month:</p>
<p>**What exactly are you granting, and what keeps working after you stop watching?**</p>
<p>## An agent is not an app</p>
<p>This is the distinction most people miss, and it's the whole risk model.</p>
<p>An **app** asks for permission and runs when you open it. Access is bounded by your attention. If it does something unexpected, you're usually looking at the screen.</p>
<p>An **agent** differs in two ways:</p>
<p>1. **Standing access.** The grant persists across sessions rather than being requested each time.</p>
<p>2. **It acts on your behalf.** The output isn't just data leaving your device — it's things happening in the world. An email sent. A booking made. A payment authorised.</p>
<p>Combine those and a compromise changes category. A leaked copy of your calendar is bad. An agent that can read your calendar, write your email and move money is closer to someone holding your phone, unlocked, for as long as the token lives.</p>
<p>## Six checks before you grant anything</p>
<p>### 1. Separate read from write</p>
<p>"Access your email" can mean reading it to summarise your day, or sending mail *as you*. These are not the same permission and they are not the same risk. If the grant screen doesn't distinguish them, assume the broader one.</p>
<p>From an OAuth standpoint this is just scope granularity: `mail.read` versus `mail.send`. Read is already significant. Send-as-you is the one that turns a mistake into an incident.</p>
<p>### 2. Look at scope, not just category</p>
<p>Full-mailbox access and access to one label are both "email access." Same for calendars: every calendar versus one you create specifically for the agent. If the tool supports scoping, use it. If it doesn't, that tells you how the vendor thinks about your data.</p>
<p>### 3. Two questions, not one</p>
<p>People collapse these, but they're separate:</p>
<p>- Is processing local or in the vendor's cloud?</p>
<p>- Does your content become training data?</p>
<p>The second matters more than expected, because "we don't train on your data" and "we don't train on your data by default, but you can opt in" are very different sentences that look nearly identical on a settings page.</p>
<p>### 4. Find the revocation path *before* you need it</p>
<p>Two separate things:</p>
<p>- Where do I turn this off?</p>
<p>- Does turning it off **delete what it already collected**?</p>
<p>These are frequently different processes, and the second is usually buried. An agent you can't cleanly revoke is a commitment, not a feature. Check the connected-apps panel of the granting account and see whether revocation also invalidates the issued tokens — sometimes it doesn't.</p>
<p>### 5. Decide what it may do with third parties</p>
<p>An agent that can negotiate or transact is acting toward other people *in your name*. That's a much larger grant than one that only organises information you already have. If payment authority is involved, look for per-action confirmation and a spend ceiling rather than blanket authorisation.</p>
<p>### 6. Demand an audit trail</p>
<p>You should be able to see what the agent did, when, and on whose instruction. Without a log you can't detect a wrong action and can't reconstruct one after the fact. No activity history means every action is unverifiable.</p>
<p>## The part that worries me most</p>
<p>An agent holding your email and calendar isn't only a privacy question. It's the best phishing pretext ever assembled.</p>
<p>Everything a convincing lure needs — who you talk to, what you're working on, when you're away, what you bought — is exactly what these agents are being given. If that store is reachable, the messages produced will be better than anything in circulation today.</p>
<p>Attackers are already moving from stealing passwords to borrowing legitimate access. A related operation I wrote about, BigBear, took **474 Microsoft 365 sessions with MFA fully satisfied** using a relay proxy. An agent account is the most concentrated form of legitimate access most people will ever hold.</p>
<p>## If you run a system others use</p>
<p>An employee granting an agent access to a work mailbox is effectively granting a third party access to company data. Not always wrong — frequently useful — but it should be a decision with an owner, not something that happens during a product tour.</p>
<p>The minimum:</p>
<p>- Know which agents hold tokens against your tenant.</p>
<p>- Log what they do.</p>
<p>- Make sure offboarding revokes them. Offboarding that closes the account but leaves the agent's OAuth token alive is easy to create and very hard to notice.</p>
<p>## The honest read</p>
<p>I'm not going to tell you not to use these tools. Some will save real time, and refusing them on principle isn't a strategy.</p>
<p>But the permission screen is the wrong place to start thinking. By the time it appears, the decision is framed as "allow access to continue," and the interesting questions — what persists, what it can do without you, what happens on revocation — have already been settled somewhere else, usually in a settings page nobody opens.</p>
<p>Read those first. The agent can wait thirty seconds.</p>
<p>---</p>
<p>Originally published at [CyberPicks](<a href="https://cyberpicks.org/guides/ai-agent-permission-checklist">https://cyberpicks.org/guides/ai-agent-permission-checklist</a>).</p>
<p>---</p>
<p>*Originally published at <a href="https://cyberpicks.org/guides/ai-agent-permission-checklist%5C">https://cyberpicks.org/guides/ai-agent-permission-checklist\</a>*</p>
]]></content:encoded></item><item><title><![CDATA[219,665 Records Through One API Endpoint: Broken Object-Level Authorization in Production]]></title><description><![CDATA[Gangnam Unni is a South Korean platform that connects people with cosmetic surgery clinics. On **September 4, 2026**, an API used to look up consultation records was accessed abnormally. The operator,]]></description><link>https://toolkit-ai-reviews.hashnode.dev/219-665-records-through-one-api-endpoint-broken-object-level-authorization-in-production</link><guid isPermaLink="true">https://toolkit-ai-reviews.hashnode.dev/219-665-records-through-one-api-endpoint-broken-object-level-authorization-in-production</guid><category><![CDATA[Security]]></category><category><![CDATA[api]]></category><category><![CDATA[privacy]]></category><dc:creator><![CDATA[孙永瑞]]></dc:creator><pubDate>Wed, 09 Sep 2026 10:21:11 GMT</pubDate><content:encoded><![CDATA[<p>Gangnam Unni is a South Korean platform that connects people with cosmetic surgery clinics. On **September 4, 2026**, an API used to look up consultation records was accessed abnormally. The operator, Healing Paper, blocked that route — and then found the same attacker trying a **different path the next day**.</p>
<p>Confirmed total: **219,665 affected users** (~160,000 South Korea, 48,000 Japan, 4,218 Taiwan, 1,591 Thailand, 481 mainland China, 5,308 elsewhere).</p>
<p>I'm not writing about the breach count. I'm writing about the entry point, because it's the one that keeps showing up and the one that's hardest to catch in review.</p>
<p>## No exploit was involved</p>
<p>This wasn't a memory corruption bug, a stolen admin credential, or an unpatched CVE. Nothing was technically *broken*. An endpoint that was supposed to answer "what are this user's consultation records" answered for more records than it should have, to more callers than it should have.</p>
<p>That's broken object-level authorization — the API security category where the endpoint authenticates the caller but fails to verify that the caller is entitled to *the specific object* being requested. It survives code review because the function looks correct in isolation:</p>
<p>```python</p>
<p>@app.get("/api/consultations/{record_id}")</p>
<p>def get_consultation(record_id: str, user: User = Depends(current_user)):</p>
<p>return db.consultations.find(record_id) # authenticated, not authorized</p>
<p>```</p>
<p>The reviewer sees `current_user`, sees that unauthenticated requests are rejected, and moves on. The missing check is the relationship between `user` and `record_id`, and it isn't visible in this function at all.</p>
<p>## Why it's hard to catch</p>
<p>- **It produces valid responses.** Nothing throws. Status codes are 200. Error-rate alerting sees nothing unusual.</p>
<p>- **It looks like normal traffic.** Sequential or enumerable IDs are indistinguishable from legitimate use without behavioural baselining.</p>
<p>- **Unit tests pass.** You test that a user can fetch *their* record. Almost nobody writes the negative test for fetching *someone else's*.</p>
<p>- **It's not in the dependency tree.** No scanner will flag it. This is first-party logic.</p>
<p>## The detail that should worry you most</p>
<p>The attacker came back through a **second path the day after the first was closed**.</p>
<p>That's the part I keep thinking about. Closing one route didn't end the incident, because the underlying authorization model was the problem — not the one endpoint that got caught. Whoever this was knew the system well enough to have a fallback ready, which means they'd mapped it.</p>
<p>If your incident response is "block the route that was abused," you're treating the symptom. The fix is fixing the authorization layer; otherwise you're playing whack-a-mole against someone who has already read your codebase's shape.</p>
<p>## What to actually check in your own API</p>
<p>1. **Every object-scoped endpoint, list them.** For each one, write down where the ownership check happens. If the answer is "in the service layer" or "the ORM scopes it," verify it — don't assume.</p>
<p>2. **Write the negative test.** For each of those endpoints, add a test where user A requests user B's resource. It should fail. If that test doesn't exist, the guarantee doesn't either.</p>
<p>3. **Prefer non-enumerable identifiers.** Sequential integers turn a single authorization bug into a full-table dump. UUIDs don't fix BOLA, but they raise the cost of exploitation dramatically.</p>
<p>4. **Rate-limit per identity, not per IP.** Abnormal access to a lookup API is detectable — but only if you're counting per-authenticated-principal rather than per-source-address.</p>
<p>5. **Log object access with both IDs.** Your audit log needs the requesting identity *and* the object accessed, or you cannot reconstruct scope after the fact.</p>
<p>## The data made it worse</p>
<p>The exposed fields split into two layers. First, ordinary identity data: name, phone, email, date of birth, gender, residence, social account IDs, IP and device details.</p>
<p>Second, and this is why it's not a routine breach: procedures enquired about, clinic and doctor names, **the stated reason for seeking treatment**, clinical progress notes, **uploaded consultation photographs**, appointment times, and treatment and payment details.</p>
<p>A password is changed in a minute. A card is cancelled with a phone call. A pre-procedure photograph of someone's face, tied to their name and the thing they were self-conscious about, has no revocation mechanism. Korean security professionals quoted in local coverage warned about extortion using exactly that material.</p>
<p>That's the design lesson too: the reason this leak is catastrophic rather than merely bad is *what was stored in a reachable place*. Minimize the blast radius before you worry about the perimeter.</p>
<p>---</p>
<p>Originally published at [CyberPicks](<a href="https://cyberpicks.org/guides/gangnam-unni-medical-photo-breach">https://cyberpicks.org/guides/gangnam-unni-medical-photo-breach</a>).</p>
<p>---</p>
<p>*Originally published at <a href="https://cyberpicks.org/guides/gangnam-unni-medical-photo-breach%5C">https://cyberpicks.org/guides/gangnam-unni-medical-photo-breach\</a>*</p>
]]></content:encoded></item><item><title><![CDATA[How 474 Microsoft 365 Sessions Beat MFA: Inside an Evilginx2 Relay Operation]]></title><description><![CDATA[Most of us still think of MFA as the control that stops phishing. It isn't, and hasn't been for years. What MFA stops is *reuse* — someone taking your password and logging in later. What it does not s]]></description><link>https://toolkit-ai-reviews.hashnode.dev/how-474-microsoft-365-sessions-beat-mfa-inside-an-evilginx2-relay-operation</link><guid isPermaLink="true">https://toolkit-ai-reviews.hashnode.dev/how-474-microsoft-365-sessions-beat-mfa-inside-an-evilginx2-relay-operation</guid><category><![CDATA[Security]]></category><category><![CDATA[MFA]]></category><category><![CDATA[phishing]]></category><dc:creator><![CDATA[孙永瑞]]></dc:creator><pubDate>Wed, 09 Sep 2026 10:17:07 GMT</pubDate><content:encoded><![CDATA[<p>Most of us still think of MFA as the control that stops phishing. It isn't, and hasn't been for years. What MFA stops is *reuse* — someone taking your password and logging in later. What it does not stop is someone standing between you and Microsoft while you type it.</p>
<p>CloudSEK got access to the admin panel of a phishing operation called BigBear 2.0 and read its own records instead of inferring from the outside. What was in there is one of the clearer published pictures of how industrial credential theft actually runs:</p>
<p>- **5,137 records** spanning **461 organisations**</p>
<p>- **1,032 plaintext passwords**</p>
<p>- **4,148 session cookies**</p>
<p>- **474 confirmed sessions where MFA had been bypassed entirely**</p>
<p>Those 474 are the number worth staring at. Not attempts. Finished jobs where the second factor was satisfied and the account opened anyway.</p>
<p>## The mechanism: a proxy, not a fake page</p>
<p>The old phishing model was a counterfeit login form. It harvested your password and then failed, because the TOTP code you generated seconds later was useless to an attacker who needed it *right then*.</p>
<p>Adversary-in-the-middle (AiTM) kits solved that by removing the counterfeit part. BigBear runs **Evilginx2**, which is a reverse proxy:</p>
<p>1. You get a link and land on what genuinely *is* Microsoft's login page, served through the attacker's domain.</p>
<p>2. You type your password.</p>
<p>3. Microsoft asks for your second factor. You supply it.</p>
<p>4. Everything is relayed to Microsoft in real time.</p>
<p>5. Microsoft is satisfied and issues a session cookie — which returns **through the proxy**, where the attacker keeps a copy.</p>
<p>Nothing was guessed. Nothing was cracked. The attacker watched a legitimate authentication happen and kept the receipt.</p>
<p>That cookie is the entire prize. Replaying it gives access to Outlook, calendar, Teams conversations, and everything in SharePoint and OneDrive, without triggering another prompt.</p>
<p>## They deliberately disabled the one control that would have stopped them</p>
<p>FIDO2 hardware keys and passkeys defeat relay attacks completely. The credential is cryptographically bound to the origin. A proxied login presents the wrong origin, the key refuses to sign, and the attack fails with no user judgement required.</p>
<p>BigBear knew this. Its pages shipped custom JavaScript to **disable FIDO2 and WebAuthn**. With the strong option gone, users fell back to whatever remained — SMS codes and push approvals. Both are relay-friendly: you read six digits off your screen into the proxy, or you tap approve on a prompt you were already expecting.</p>
<p>If your org rolled out MFA and stopped there, that's the gap. "A second factor exists" and "a phishing-resistant second factor exists" are different statements.</p>
<p>## Residential proxies hide it from exactly the people looking</p>
<p>The operation routed through a residential proxy pool covering **69 countries**. Two jobs at once:</p>
<p>- Login attempts appear to come from real home connections in plausible locations, which helps them survive risk scoring.</p>
<p>- The pool actively filtered out visitors from data centres and VPNs — which is how researchers and scanners normally find these kits.</p>
<p>So a security team that tried to visit the phishing page from a corporate network or a cloud VM often saw nothing at all.</p>
<p>## It's a business with customers</p>
<p>The panel was run by an operator using the handle "General Boss" and rented through a multi-user interface to **at least five affiliates**. Harvested credentials were pushed out in real time via a Telegram bot.</p>
<p>That structure explains the volume better than any technical detail. This is phishing-as-a-service: the person who builds the kit isn't the person who writes the emails, and the person who steals the session isn't the person who uses it. Some infrastructure has been taken down, but CloudSEK reported the operation was still active while it was being investigated.</p>
<p>## What actually helps, ordered by risk removed</p>
<p>1. **Move to phishing-resistant factors.** Hardware keys and passkeys are the only second factors that fail closed when the domain is wrong. Roll out to admins and finance first — they're the highest-value targets.</p>
<p>2. **Shorten session lifetime and bind sessions to device state.** A stolen cookie is useful for as long as the IdP accepts it. Conditional Access policies that re-evaluate compliance and location cut that window down.</p>
<p>3. **Treat unexpected MFA prompts as hostile.** Push fatigue *is* the attack. "Approve because it's probably me" is the whole mechanism.</p>
<p>4. **Remove SMS as an option where you can.** It's the fallback these kits are engineered to force you into.</p>
<p>5. **Assume mailbox access means broad access.** Once a session is held, password reset flows for other services are the next step.</p>
<p>## The uncomfortable part</p>
<p>MFA was never a wall. It was a speed bump that raised the cost of credential reuse, and kits like this one route around it by not reusing anything. The 474 sessions aren't a failure of the users who typed their codes — they typed them into a real Microsoft page that asked for them.</p>
<p>"Turn on MFA" was the right instruction in 2018. In 2026 the instruction is "turn on MFA that cannot be relayed," and anything less is a checkbox that looks like protection while delivering considerably less than people assume.</p>
<p>---</p>
<p>Originally published at [CyberPicks](<a href="https://cyberpicks.org/guides/bigbear-mfa-bypass-evilginx">https://cyberpicks.org/guides/bigbear-mfa-bypass-evilginx</a>).</p>
<p>---</p>
<p>*Originally published at <a href="https://cyberpicks.org/guides/bigbear-mfa-bypass-evilginx%5C">https://cyberpicks.org/guides/bigbear-mfa-bypass-evilginx\</a>*</p>
]]></content:encoded></item></channel></rss>