<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Breakout Time</title><description>Nothing says &quot;fine&quot; like lateral movement.</description><link>https://blog.sploitable.com/</link><language>en-gb</language><atom:link href="https://blog.sploitable.com/rss.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.sploitable.com/icon-192.png</url><title>Breakout Time</title><link>https://blog.sploitable.com/</link></image><item><title>The Problem with “Attackers don’t break in, they log in”</title><link>https://blog.sploitable.com/articles/the-problem-with-attackers-dont-break-in-they-log-in/</link><guid isPermaLink="true">https://blog.sploitable.com/articles/the-problem-with-attackers-dont-break-in-they-log-in/</guid><description>“Attackers don’t break in, they log in” is a misleading half truth, and it shapes detection badly.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For some reason it has become socially acceptable to say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Attackers don’t break in, they log in” — Microsoft CISO, 2019&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I take issue with this phrase because it is a misleading half truth. A more accurate version would be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Attackers don’t break in, they log in (after purchasing the ability to log in from an attacker who did break in)”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nobody “just logs in” to your network. Not unless you’re a UNIX terminal and the year is 1988. To log in you need credentials; typically a password, an API token, or a browser session token — at minimum. These have a distinct characteristic of &lt;em&gt;not&lt;/em&gt; spontaneously appearing out of thin air. So where &lt;em&gt;do&lt;/em&gt; they come from?&lt;/p&gt;
&lt;p&gt;Well, attackers can make educated guesses about what your password &lt;em&gt;might&lt;/em&gt; be — based on commonly used password structures e.g. surname followed by the last two digits of your date of birth. Or, they can do an exhaustive search of &lt;em&gt;all&lt;/em&gt; the possible passwords you &lt;em&gt;could’ve&lt;/em&gt; chosen from. Or, they can take a list of known common passwords and try all of those. There are many ways. But the important point is, these methods are as old as computers themselves — arguably related to the very reason why computers were invented in the first place — I digress.&lt;/p&gt;
&lt;p&gt;What &lt;em&gt;is&lt;/em&gt; new, relatively speaking, is the industrialisation of the cyber crime economy. It comprises supply chains where each participant provides a service to the next — for a fee.&lt;/p&gt;
&lt;p&gt;The criminal who “just logged in” purchased credentials from an &lt;em&gt;Initial Access Broker&lt;/em&gt;, who was sold the credentials by &lt;em&gt;someone else&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The other person will be indiscriminately harvesting large quantities of credentials by infecting as many hosts as possible with &lt;em&gt;info-stealer malware&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To do this they had to “break in”.&lt;/p&gt;
&lt;p&gt;You see, &lt;em&gt;someone&lt;/em&gt; had to break in to steal the creds. It may not be the &lt;em&gt;same&lt;/em&gt; person who ultimately &lt;em&gt;uses&lt;/em&gt; the creds, but someone had to break in nonetheless.&lt;/p&gt;
&lt;p&gt;For the sake of completion, the info-stealer malware may well have been licenced or purchased from a Malware-as-a-Service provider, customised and then delivered to your mailbox using a commodity Phishing kit.&lt;/p&gt;
&lt;p&gt;As a defender, it generally makes little difference &lt;em&gt;who&lt;/em&gt; is doing what in this story. You are still interested in the same things you have always been interested in i.e. detecting initial access, execution, privilege escalation and credential access. What you’re &lt;em&gt;not&lt;/em&gt; going to do is abandon this and focus entirely on monitoring for credential abuse in your cloud environments. If all you are looking for is the latter then it’s too late.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-1.HoEhwMHe.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>The Real Barrier to Machine-Speed Defence</title><link>https://blog.sploitable.com/articles/the-real-barrier-to-machine-speed-defence/</link><guid isPermaLink="true">https://blog.sploitable.com/articles/the-real-barrier-to-machine-speed-defence/</guid><description>Machine-speed attacks need machine-speed defence, but the real barrier is not the technology.</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Machine-speed attacks require machine-speed defence. It’s that simple.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Put the best trader in the world up against a high-frequency trading algorithm and ask them to compete on speed. The human loses before they have even registered that the price moved.&lt;/p&gt;
&lt;p&gt;Cyber defence has the same problem. You cannot match machine-speed attacks with humans operating at a speed determined by caffeine, office noise, and the number of “important” meetings sitting in their calendar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-1.CXvfQlVR.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Humans are the latency.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Machine-speed defence means taking them out of decisions that involve competing against machines.&lt;/p&gt;
&lt;p&gt;And this is where things get awkward.&lt;/p&gt;
&lt;p&gt;The obvious answer is to let machines investigate, decide and act.&lt;/p&gt;
&lt;p&gt;Except the moment you try to do that, you expose an inconvenient truth. Every generation of SOC analysts has been quietly compensating for a fundamental weakness in the way security gets done. They have been carrying your organisation and nobody realised.&lt;/p&gt;
&lt;p&gt;I can say with a high degree of confidence that your &lt;em&gt;security policies&lt;/em&gt; are not ready to direct agents.&lt;/p&gt;
&lt;p&gt;Let me show you why.&lt;/p&gt;
&lt;h2&gt;It is 02:00 and your customer database is leaving the building&lt;/h2&gt;
&lt;p&gt;One of your privileged database administrator accounts has started exporting a large volume of customer data from production to a system it has never touched before.&lt;/p&gt;
&lt;p&gt;Your security agent is watching it happen.&lt;/p&gt;
&lt;p&gt;It has already done the investigation.&lt;/p&gt;
&lt;p&gt;The account is privileged. The destination is unusual. The volume is abnormal. The activity came from an administrative host. Nothing similar has happened in the last six months.&lt;/p&gt;
&lt;p&gt;You probably want it stopped.&lt;/p&gt;
&lt;p&gt;Except there is a major database migration happening tonight.&lt;/p&gt;
&lt;p&gt;Fine.&lt;/p&gt;
&lt;p&gt;Check the change record.&lt;/p&gt;
&lt;p&gt;There is one.&lt;/p&gt;
&lt;p&gt;It is approved.&lt;/p&gt;
&lt;p&gt;Unfortunately, the destination in the change record is not the destination your customer data is currently heading towards.&lt;/p&gt;
&lt;p&gt;Now what?&lt;/p&gt;
&lt;p&gt;Kill the export?&lt;/p&gt;
&lt;p&gt;Disable the DBA account?&lt;/p&gt;
&lt;p&gt;Isolate the server?&lt;/p&gt;
&lt;p&gt;Keep watching?&lt;/p&gt;
&lt;p&gt;Ask somebody?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-2.BfILZD29.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That last answer is what we normally do.&lt;/p&gt;
&lt;p&gt;And that is exactly why this is &lt;strong&gt;not&lt;/strong&gt; machine-speed defence.&lt;/p&gt;
&lt;p&gt;The machine has already done the security investigation. The thing stopping it now is not telemetry, correlation or reasoning.&lt;/p&gt;
&lt;p&gt;It does not know what &lt;strong&gt;you want it to do&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Machine-speed defence is really policy enforcement&lt;/h2&gt;
&lt;p&gt;Agents are goal-driven systems.&lt;/p&gt;
&lt;p&gt;That matters more than it sounds.&lt;/p&gt;
&lt;p&gt;In security, the goal is not simply “&lt;em&gt;Stop attacks”.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If it were, this would all be much easier. Disable every suspicious account. Isolate every suspicious server. Block anything unusual.&lt;/p&gt;
&lt;p&gt;You would have excellent containment metrics and possibly no functioning business. Bravo.&lt;/p&gt;
&lt;p&gt;Your organisation has already made choices about which risks it accepts, which systems matter most, which interruptions are tolerable, who is allowed to do what, and when security is allowed to intervene.&lt;/p&gt;
&lt;p&gt;We do not usually describe those choices as &lt;em&gt;goals&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But that is effectively what they are.&lt;/p&gt;
&lt;p&gt;Security policy encodes the organisation’s goals for managing risk.&lt;/p&gt;
&lt;p&gt;Once you remove the human from the decision, this becomes very obvious.&lt;/p&gt;
&lt;p&gt;Your machine-speed defensive system is, in effect, a &lt;strong&gt;security policy enforcement system&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The investigation tells it what is happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Policy tells it what should happen next.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is the part we are not ready for.&lt;/p&gt;
&lt;h2&gt;“Check whether it is authorised” is not enough&lt;/h2&gt;
&lt;p&gt;The obvious instruction is: “&lt;em&gt;Check whether the activity is authorised.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Great.&lt;/p&gt;
&lt;p&gt;What does &lt;em&gt;authorised&lt;/em&gt; mean?&lt;/p&gt;
&lt;p&gt;Does an approved migration allow &lt;em&gt;any&lt;/em&gt; database administrator to export the data?&lt;/p&gt;
&lt;p&gt;Does the &lt;em&gt;source&lt;/em&gt; database have to match the change?&lt;/p&gt;
&lt;p&gt;Does the &lt;em&gt;destination&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-3.sPUkIFc6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Does the DBA need to be explicitly named?&lt;/p&gt;
&lt;p&gt;What if the migration runs an hour late?&lt;/p&gt;
&lt;p&gt;What if the original destination fails and the infrastructure team switches targets halfway through?&lt;/p&gt;
&lt;p&gt;What if that change was approved in Teams but nobody updated the ticket?&lt;/p&gt;
&lt;p&gt;A human can cope with this.&lt;/p&gt;
&lt;p&gt;Your analyst sees the approved migration, recognises the database team, messages somebody and discovers that the target changed twenty minutes ago because the original one failed.&lt;/p&gt;
&lt;p&gt;They close the alert.&lt;/p&gt;
&lt;p&gt;Perfectly reasonable.&lt;/p&gt;
&lt;p&gt;They probably did not read your privileged-access policy first.&lt;/p&gt;
&lt;p&gt;They may not know where it is.&lt;/p&gt;
&lt;p&gt;That does not stop them making the decision.&lt;/p&gt;
&lt;p&gt;This is where the real problem starts.&lt;/p&gt;
&lt;h2&gt;Most SOCs run on policy-as-lore&lt;/h2&gt;
&lt;p&gt;SOC analysts make security decisions every day without consulting formal security policy.&lt;/p&gt;
&lt;p&gt;They still somehow know what to do.&lt;/p&gt;
&lt;p&gt;They know the infrastructure team uses a tool that looks suspicious but appears every patching weekend.&lt;/p&gt;
&lt;p&gt;They know a particular service account looks horrifying in the logs but belongs to an essential overnight process.&lt;/p&gt;
&lt;p&gt;They know you technically &lt;em&gt;can&lt;/em&gt; isolate a certain production server, but doing so without calling the service owner first would be career-limiting.&lt;/p&gt;
&lt;p&gt;Where is that policy?&lt;/p&gt;
&lt;p&gt;Some of it is in IAM.&lt;/p&gt;
&lt;p&gt;Some is in the CMDB.&lt;/p&gt;
&lt;p&gt;Some is in the change system.&lt;/p&gt;
&lt;p&gt;Some is in runbooks.&lt;/p&gt;
&lt;p&gt;Some comes from old incidents.&lt;/p&gt;
&lt;p&gt;Some was explained in a Teams conversation eighteen months ago.&lt;/p&gt;
&lt;p&gt;Some exists entirely inside the heads of experienced analysts.&lt;/p&gt;
&lt;p&gt;Some of it may be walking out the door.&lt;/p&gt;
&lt;p&gt;SOCs do not operate on policy-as-code.&lt;/p&gt;
&lt;p&gt;They operate on &lt;strong&gt;policy-as-lore&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And, for the most part, it kind of works.&lt;/p&gt;
&lt;p&gt;Humans are exceptionally good at taking incomplete records, local knowledge, precedent, conversations and vague rules and turning them into a decision.&lt;/p&gt;
&lt;p&gt;We call that &lt;em&gt;experience&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;For a machine, it is &lt;em&gt;missing state&lt;/em&gt; and &lt;em&gt;missing rules&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That is why a senior analyst can resolve something in five minutes while a new hire new spends forty minutes working out who to ask.&lt;/p&gt;
&lt;p&gt;The senior analyst is not just better at reading logs.&lt;/p&gt;
&lt;p&gt;They know the lore.&lt;/p&gt;
&lt;p&gt;That becomes a serious problem when you want the decision in seconds.&lt;/p&gt;
&lt;h2&gt;Machine-readable is not decision-complete&lt;/h2&gt;
&lt;p&gt;There is an obvious response to this.&lt;/p&gt;
&lt;p&gt;Make the policy machine-readable.&lt;/p&gt;
&lt;p&gt;Good. You should.&lt;/p&gt;
&lt;p&gt;But do not confuse representation with decision-making.&lt;/p&gt;
&lt;p&gt;Take a perfectly normal policy statement: “&lt;em&gt;Privileged access must only be used for authorised business purposes.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can put that in YAML, JSON, Rego or anything else you like.&lt;/p&gt;
&lt;p&gt;The machine can parse it perfectly.&lt;/p&gt;
&lt;p&gt;It still has no idea what to do.&lt;/p&gt;
&lt;p&gt;Who is authorised?&lt;/p&gt;
&lt;p&gt;Authorised by whom?&lt;/p&gt;
&lt;p&gt;For which systems?&lt;/p&gt;
&lt;p&gt;For which actions?&lt;/p&gt;
&lt;p&gt;For how long?&lt;/p&gt;
&lt;p&gt;Which system proves that authorisation?&lt;/p&gt;
&lt;p&gt;What happens when IAM and the change system disagree?&lt;/p&gt;
&lt;p&gt;How fresh does that information need to be?&lt;/p&gt;
&lt;p&gt;What happens when the required information is unavailable?&lt;/p&gt;
&lt;p&gt;And if the policy has been violated, what is the machine actually allowed to do about it?&lt;/p&gt;
&lt;p&gt;That is the difference between &lt;strong&gt;machine-readable&lt;/strong&gt; and &lt;strong&gt;decision-complete&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-4.DcvGS3JO.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A decision-complete policy contains enough information for the machine to reach the operational decision without handing the difficult bits back to a human.&lt;/p&gt;
&lt;p&gt;For our database migration example it might need something more like:&lt;/p&gt;
&lt;p&gt;An approved migration is currently active.&lt;/p&gt;
&lt;p&gt;The source database is within its scope.&lt;/p&gt;
&lt;p&gt;The destination is within its scope.&lt;/p&gt;
&lt;p&gt;The identity performing the export is authorised for it.&lt;/p&gt;
&lt;p&gt;The activity falls within the approved time window.&lt;/p&gt;
&lt;p&gt;No current security restriction overrides that approval.&lt;/p&gt;
&lt;p&gt;Now the machine has something it can evaluate.&lt;/p&gt;
&lt;p&gt;We did not make the AI smarter.&lt;/p&gt;
&lt;p&gt;We made the decision explicit.&lt;/p&gt;
&lt;p&gt;Policy-as-code solves the representation problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Machine-speed defence requires you to solve the decision problem.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The speed comes from making decisions earlier&lt;/h2&gt;
&lt;p&gt;Go back to the database export.&lt;/p&gt;
&lt;p&gt;The alert fires.&lt;/p&gt;
&lt;p&gt;Only &lt;em&gt;then&lt;/em&gt; does the analyst start finding the information needed to make the decision.&lt;/p&gt;
&lt;p&gt;Who owns the database?&lt;/p&gt;
&lt;p&gt;Is there a migration?&lt;/p&gt;
&lt;p&gt;Who approved it?&lt;/p&gt;
&lt;p&gt;Which destination was approved?&lt;/p&gt;
&lt;p&gt;Is this DBA authorised?&lt;/p&gt;
&lt;p&gt;What happens if we stop the transfer?&lt;/p&gt;
&lt;p&gt;Who is allowed to make that call?&lt;/p&gt;
&lt;p&gt;The machine can collect the security evidence in seconds and still end up waiting while a human works through those questions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-5.yZxAIPVs.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That is where much of the latency actually lives.&lt;/p&gt;
&lt;p&gt;If you want the decision in seconds, you need to settle more of those questions &lt;em&gt;before&lt;/em&gt; the incident.&lt;/p&gt;
&lt;p&gt;Define what counts as an authorised migration.&lt;/p&gt;
&lt;p&gt;Define which system proves it.&lt;/p&gt;
&lt;p&gt;Define how closely reality must match the approval.&lt;/p&gt;
&lt;p&gt;Define how current that approval needs to be.&lt;/p&gt;
&lt;p&gt;Define what happens when information is missing.&lt;/p&gt;
&lt;p&gt;Define which actions security is allowed to take without asking anyone.&lt;/p&gt;
&lt;p&gt;Then the event happens and the machine evaluates decisions you have already made.&lt;/p&gt;
&lt;p&gt;That is where the speed comes from.&lt;/p&gt;
&lt;p&gt;Not because AI develops some supernatural understanding of your company.&lt;/p&gt;
&lt;p&gt;Because you stop asking a human to resolve the same ambiguity every time something suspicious happens.&lt;/p&gt;
&lt;h2&gt;Your runbook probably contains more lore&lt;/h2&gt;
&lt;p&gt;You may think your runbooks already solve this problem. Guess again.&lt;/p&gt;
&lt;p&gt;Open one.&lt;/p&gt;
&lt;p&gt;You will probably find something like:&lt;/p&gt;
&lt;p&gt;1. Determine whether the activity is authorised.&lt;br /&gt;
2. Check for an approved change.&lt;br /&gt;
3. Assess business impact.&lt;br /&gt;
4. Contain if appropriate.&lt;/p&gt;
&lt;p&gt;That is entirely reasonable guidance for a &lt;em&gt;human&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It is also nowhere near decision-complete.&lt;/p&gt;
&lt;p&gt;What counts as authorised?&lt;/p&gt;
&lt;p&gt;Which change states count?&lt;/p&gt;
&lt;p&gt;How closely must the observed activity match the ticket?&lt;/p&gt;
&lt;p&gt;How do you assess business impact?&lt;/p&gt;
&lt;p&gt;When is containment appropriate?&lt;/p&gt;
&lt;p&gt;The difficult decisions are still hidden inside normal English.&lt;/p&gt;
&lt;p&gt;A runbook tells a human &lt;em&gt;where&lt;/em&gt; to apply judgement**.**&lt;/p&gt;
&lt;p&gt;It does not &lt;em&gt;remove&lt;/em&gt; the judgement.&lt;/p&gt;
&lt;p&gt;Making the runbook machine-readable does not resolve the problem either.&lt;/p&gt;
&lt;p&gt;You now have a machine-readable instruction saying: “&lt;em&gt;Contain if appropriate.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wonderful.&lt;/p&gt;
&lt;p&gt;The agent still needs you to decide what &lt;strong&gt;appropriate&lt;/strong&gt; means.&lt;/p&gt;
&lt;h2&gt;And then the change system goes down…&lt;/h2&gt;
&lt;p&gt;Our database migration is still running.&lt;/p&gt;
&lt;p&gt;The source database matches the approved change. Check.&lt;/p&gt;
&lt;p&gt;The administrator matches. Check.&lt;/p&gt;
&lt;p&gt;The destination does not. Uh oh!&lt;/p&gt;
&lt;p&gt;The agent tries to check whether the change was updated.&lt;/p&gt;
&lt;p&gt;The change platform is sadly &lt;em&gt;unavailable&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-6.Cjuoi5t1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The agent’s last copy of the ticket is &lt;strong&gt;six hours old&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What should it conclude?&lt;/p&gt;
&lt;p&gt;There is a dangerous shortcut here.&lt;/p&gt;
&lt;p&gt;This:&lt;/p&gt;
&lt;p&gt;I cannot confirm this activity is still authorised.&lt;/p&gt;
&lt;p&gt;quietly becomes:&lt;/p&gt;
&lt;p&gt;This activity is unauthorised.&lt;/p&gt;
&lt;p&gt;Those are not the same statement.&lt;/p&gt;
&lt;p&gt;If your IAM feed goes down, every administrator does not suddenly become an attacker.&lt;/p&gt;
&lt;p&gt;If your change platform stops responding, every maintenance process does not suddenly become malicious.&lt;/p&gt;
&lt;p&gt;Once machines start enforcing policy, that distinction matters, a lot.&lt;/p&gt;
&lt;p&gt;You need a third outcome:&lt;/p&gt;
&lt;p&gt;ALLOW&lt;/p&gt;
&lt;p&gt;DENY&lt;/p&gt;
&lt;p&gt;ABSTAIN&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abstain is a security control.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-7.BezumvEl.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The machine is saying: “&lt;em&gt;I do not have enough reliable information to make this particular decision safely.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It can keep investigating.&lt;/p&gt;
&lt;p&gt;It can collect more evidence.&lt;/p&gt;
&lt;p&gt;It can escalate.&lt;/p&gt;
&lt;p&gt;It may still take low-impact actions that do not depend on the missing information.&lt;/p&gt;
&lt;p&gt;What it should &lt;em&gt;not&lt;/em&gt; do is &lt;strong&gt;manufacture certainty&lt;/strong&gt; because ServiceNow suddenly stopped returning its calls.&lt;/p&gt;
&lt;p&gt;That means &lt;em&gt;freshness&lt;/em&gt; itself becomes part of the decision.&lt;/p&gt;
&lt;p&gt;How stale can an approval be before you stop trusting it?&lt;/p&gt;
&lt;p&gt;How current must privilege information be before a machine disables an account?&lt;/p&gt;
&lt;p&gt;How old can asset information be before automatic isolation is allowed?&lt;/p&gt;
&lt;p&gt;Your AI vendor cannot answer those questions.&lt;/p&gt;
&lt;p&gt;You have to.&lt;/p&gt;
&lt;h2&gt;Fine. The account is compromised&lt;/h2&gt;
&lt;p&gt;While the export continues, the agent finds something else.&lt;/p&gt;
&lt;p&gt;The DBA account authenticated from a host it has never previously used.&lt;/p&gt;
&lt;p&gt;That host triggered a credential-theft detection ten minutes earlier.&lt;/p&gt;
&lt;p&gt;It is now probing other production systems.&lt;/p&gt;
&lt;p&gt;Let us remove the uncertainty.&lt;/p&gt;
&lt;p&gt;Assume the agent is right.&lt;/p&gt;
&lt;p&gt;The account &lt;em&gt;is&lt;/em&gt; compromised.&lt;/p&gt;
&lt;p&gt;Can it disable it?&lt;/p&gt;
&lt;p&gt;Maybe.&lt;/p&gt;
&lt;p&gt;You still have two separate questions to answer:&lt;/p&gt;
&lt;p&gt;1. Has security policy been violated?&lt;/p&gt;
&lt;p&gt;2. What are you authorised to do about it?&lt;/p&gt;
&lt;p&gt;The machine can know an attack is happening and still not have permission to stop it.&lt;/p&gt;
&lt;p&gt;Perhaps terminating the database export halfway through risks corrupting the migration.&lt;/p&gt;
&lt;p&gt;Perhaps the administrator account is also supporting an emergency recovery process.&lt;/p&gt;
&lt;p&gt;Perhaps this system is so critical that isolation requires approval from the service owner.&lt;/p&gt;
&lt;p&gt;Whether those are &lt;strong&gt;sensible&lt;/strong&gt; boundaries is beside the point.&lt;/p&gt;
&lt;p&gt;They are &lt;strong&gt;your&lt;/strong&gt; boundaries.&lt;/p&gt;
&lt;p&gt;Even when the agent knows it is an attack, it still needs to know whether you have authorised it to act.&lt;/p&gt;
&lt;p&gt;Machine-speed defence therefore needs &lt;em&gt;delegated authority&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;What may the machine kill?&lt;/p&gt;
&lt;p&gt;What may it isolate?&lt;/p&gt;
&lt;p&gt;Which identities may it disable?&lt;/p&gt;
&lt;p&gt;Under which conditions?&lt;/p&gt;
&lt;p&gt;How much uncertainty is acceptable?&lt;/p&gt;
&lt;p&gt;When must it abstain?&lt;/p&gt;
&lt;p&gt;Which decisions do you deliberately keep for people?&lt;/p&gt;
&lt;p&gt;“Human in the loop” is not an answer.&lt;/p&gt;
&lt;p&gt;It is often just a polite way of saying we have not worked this out yet.&lt;/p&gt;
&lt;h2&gt;This is where generic security agents hit the wall&lt;/h2&gt;
&lt;p&gt;A vendor can give you an extremely capable agent.&lt;/p&gt;
&lt;p&gt;It can query your EDR.&lt;/p&gt;
&lt;p&gt;Inspect identity history.&lt;/p&gt;
&lt;p&gt;Correlate network and endpoint events.&lt;/p&gt;
&lt;p&gt;Follow an attack across cloud and on-premise systems.&lt;/p&gt;
&lt;p&gt;Reconstruct what happened faster than your analysts.&lt;/p&gt;
&lt;p&gt;Excellent.&lt;/p&gt;
&lt;p&gt;What it cannot ship in the box is the answer to our database migration.&lt;/p&gt;
&lt;p&gt;It does not know that the migration is happening.&lt;/p&gt;
&lt;p&gt;It does not know what tonight’s approval actually covers.&lt;/p&gt;
&lt;p&gt;It does not know whether a Teams message counts as emergency authorisation.&lt;/p&gt;
&lt;p&gt;It does not know how stale your change data may become before the machine must abstain.&lt;/p&gt;
&lt;p&gt;It does not know what happens to the business if it kills the export.&lt;/p&gt;
&lt;p&gt;And it does not know what authority you have delegated to security.&lt;/p&gt;
&lt;p&gt;Those are not missing AI features.&lt;/p&gt;
&lt;p&gt;They are properties of your organisation.&lt;/p&gt;
&lt;p&gt;The investigation machinery can be generic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The decision model cannot be.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can let the agent learn what your analysts normally do.&lt;/p&gt;
&lt;p&gt;That may be useful.&lt;/p&gt;
&lt;p&gt;But now you are teaching it policy-as-lore by observation, complete with undocumented exceptions, inconsistencies and bad habits.&lt;/p&gt;
&lt;p&gt;Or you can make it ask a human whenever things become unclear.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-8.Cul5bne9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Congratulations.&lt;/p&gt;
&lt;p&gt;Your machine-speed defence is now waiting for somebody to reply on Teams at 02:00.&lt;/p&gt;
&lt;h2&gt;Do not turn lore into bureaucracy-as-code&lt;/h2&gt;
&lt;p&gt;There is a horrible possible conclusion to all this.&lt;/p&gt;
&lt;p&gt;Someone decides the answer is to formally specify every legitimate thing every person and machine in the company is allowed to do.&lt;/p&gt;
&lt;p&gt;Please don’t.&lt;/p&gt;
&lt;p&gt;You will create &lt;em&gt;bureaucracy-as-code&lt;/em&gt; and still fail.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-9.CwacI9Op.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;People improvise.&lt;/p&gt;
&lt;p&gt;Systems break.&lt;/p&gt;
&lt;p&gt;Emergency changes happen.&lt;/p&gt;
&lt;p&gt;Attackers do things you did not anticipate.&lt;/p&gt;
&lt;p&gt;Some decisions genuinely need judgement.&lt;/p&gt;
&lt;p&gt;Keep humans for those.&lt;/p&gt;
&lt;p&gt;The goal is not to eliminate runtime judgement.&lt;/p&gt;
&lt;p&gt;It is to stop wasting runtime judgement on decisions you make repeatedly.&lt;/p&gt;
&lt;p&gt;If analysts always ask whether the same activity is covered by an approved change, expose that information to the agent.&lt;/p&gt;
&lt;p&gt;If the same exception is approved every month, decide what the rule &lt;em&gt;actually&lt;/em&gt; is.&lt;/p&gt;
&lt;p&gt;If every investigation requires someone to ask who owns a system, then fix the system that should already know the answer to the question.&lt;/p&gt;
&lt;p&gt;Turn the &lt;em&gt;useful&lt;/em&gt; parts of policy-as-lore into decision-complete policy.&lt;/p&gt;
&lt;p&gt;Leave the genuinely weird cases to people.&lt;/p&gt;
&lt;h2&gt;Pull 100 investigations on Monday morning&lt;/h2&gt;
&lt;p&gt;I would not start by giving an agent permission to isolate production servers.&lt;/p&gt;
&lt;p&gt;Start with 100 completed investigations.&lt;/p&gt;
&lt;p&gt;For each one, ask:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What did the analyst need to know that the security telemetry did not tell them?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe it came from IAM.&lt;/p&gt;
&lt;p&gt;Maybe a change ticket.&lt;/p&gt;
&lt;p&gt;Maybe asset ownership.&lt;/p&gt;
&lt;p&gt;Maybe Teams.&lt;/p&gt;
&lt;p&gt;Maybe the analyst just knew.&lt;/p&gt;
&lt;p&gt;Then ask: “&lt;em&gt;Could we have known this&lt;/em&gt; &lt;strong&gt;&lt;em&gt;before&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;the incident?&lt;/em&gt;&lt;strong&gt;”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If yes: “Can we express the decision precisely enough for a machine to evaluate it?”&lt;/p&gt;
&lt;p&gt;Then: “Is the underlying data fresh enough to rely on?”&lt;/p&gt;
&lt;p&gt;And finally: “If the machine reaches the answer, have we authorised it to act?”&lt;/p&gt;
&lt;p&gt;Those questions will expose your &lt;strong&gt;real&lt;/strong&gt; machine-speed defence backlog.&lt;/p&gt;
&lt;p&gt;Some of it will be telemetry.&lt;/p&gt;
&lt;p&gt;Some will be integration.&lt;/p&gt;
&lt;p&gt;Some will be data quality.&lt;/p&gt;
&lt;p&gt;I.e. engineering work.&lt;/p&gt;
&lt;p&gt;However, a lot of it will be decisions that have lived as lore for years because humans were good enough at filling in the gaps.&lt;/p&gt;
&lt;p&gt;Sooner or later the drive for machine-speed defence will inevitably expose the underlying issue for all to see.&lt;/p&gt;
&lt;h2&gt;The real barrier is not machine speed&lt;/h2&gt;
&lt;p&gt;We already have fast machines.&lt;/p&gt;
&lt;p&gt;Detections fire in seconds.&lt;/p&gt;
&lt;p&gt;We collect absurd quantities of telemetry.&lt;/p&gt;
&lt;p&gt;Agents can investigate faster than humans ever will.&lt;/p&gt;
&lt;p&gt;That is not the hard part.&lt;/p&gt;
&lt;p&gt;The hard part is getting from: “&lt;em&gt;Something bad appears to be happening.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;to: “&lt;em&gt;Given what we know right now, this is the action we have already decided an agent should take.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That is a policy-enforcement problem.&lt;/p&gt;
&lt;p&gt;The telemetry tells the machine what happened.&lt;/p&gt;
&lt;p&gt;The agent reasons about what it means.&lt;/p&gt;
&lt;p&gt;But ultimately, &lt;strong&gt;policy tells the machine what the organisation wants done about it&lt;/strong&gt;. See, I told you it was about goal setting, didn’t I?&lt;/p&gt;
&lt;p&gt;In conclusion. Policy needs to be machine-readable and it needs to be &lt;strong&gt;decision-complete&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It needs to tell the machine what matters, where the facts come from, how fresh they need to be, when uncertainty means abstain, and what authority you have actually delegated.&lt;/p&gt;
&lt;p&gt;And before you can do any of that, you have to find the real policy.&lt;/p&gt;
&lt;p&gt;Not the PDF. The policy your SOC actually runs on.&lt;/p&gt;
&lt;p&gt;The exceptions, precedent, operational knowledge and unwritten rules your analysts use every day.&lt;/p&gt;
&lt;p&gt;The policy-as-lore.&lt;/p&gt;
&lt;p&gt;Until enough of that becomes decision-complete, humans stay in the critical path.&lt;/p&gt;
&lt;p&gt;Not because the machines are too slow.&lt;/p&gt;
&lt;p&gt;Because the organisation has not yet told them, precisely enough, what it wants them to do.&lt;/p&gt;
</content:encoded></item><item><title>Stop Chatting, Start Working: Unlearning Your AI Bad Habits</title><link>https://blog.sploitable.com/articles/stop-chatting-start-working-unlearning-your-ai-bad-habits/</link><guid isPermaLink="true">https://blog.sploitable.com/articles/stop-chatting-start-working-unlearning-your-ai-bad-habits/</guid><description>Habits that work in a chat window get in the way with AI coding agents. Treat context as working memory, keep project knowledge in the project, and make the machine prove its work.</description><pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You open Microsoft Copilot, ChatGPT or Claude. You ask it to summarise a document, rewrite an email, analyse some figures or explain something unfamiliar. It replies. You add more background. The answer improves because the model now has more information about what you are trying to do.&lt;/p&gt;
&lt;p&gt;Then somebody gives you access to Claude Code, GitHub Copilot, OpenAI Codex or one of Google’s agentic coding tools.&lt;/p&gt;
&lt;p&gt;The interface looks reassuringly familiar. There is a box. You type instructions into it. Results come back.&lt;/p&gt;
&lt;p&gt;But the thing behind the box has changed.&lt;/p&gt;
&lt;p&gt;An agentic coding tool can open files, search a repository, write code, run commands, inspect errors, execute tests and keep working through intermediate steps without asking you to perform each one yourself.&lt;/p&gt;
&lt;p&gt;Suddenly that tedious manual process looks automatable. You can build the little internal tool nobody has had time for. You can turn a recurring spreadsheet ritual into a script. You can wire together APIs, process thousands of files or finally make the website you have been threatening to build for six years.&lt;/p&gt;
&lt;p&gt;You also inherit a completely different class of failure.&lt;/p&gt;
&lt;p&gt;A bad workplace AI conversation might waste ten minutes. A badly managed coding session can read dozens of files, make changes across a repository, generate mountains of command output and consume a surprising amount of model usage before confidently telling you that everything is finished.&lt;/p&gt;
&lt;p&gt;The problem is that the interface still encourages you to behave as though you are chatting with it.&lt;/p&gt;
&lt;p&gt;Stop.&lt;/p&gt;
&lt;p&gt;Many of the habits that ordinary workplace AI has taught you are actively unhelpful once the AI can do work.&lt;/p&gt;
&lt;p&gt;The first habit to unlearn is the instinct to keep every conversation forever.&lt;/p&gt;
&lt;h2&gt;First, understand what you are actually using&lt;/h2&gt;
&lt;p&gt;People casually call products such as Claude Code and Codex “coding agents”. That is convenient, but it hides a distinction that becomes important once you start wondering why context behaves the way it does.&lt;/p&gt;
&lt;p&gt;At the bottom is the &lt;strong&gt;LLM&lt;/strong&gt;, the Large Language Model: the enormous neural network running somewhere in a data centre on enough hardware to lend credibility to the theory that Nvidia CEO Jensen Huang was sent back from the future with knowledge of an impending GPU shortage.&lt;/p&gt;
&lt;p&gt;The model takes some input and produces some output.&lt;/p&gt;
&lt;p&gt;Around that you can build an &lt;strong&gt;agent&lt;/strong&gt;: a goal-directed loop that repeatedly asks a model what to do next, gives it access to tools, observes the results and continues until some stopping condition is reached.&lt;/p&gt;
&lt;p&gt;Around the agent sits a &lt;strong&gt;harness&lt;/strong&gt;: the ordinary software responsible for making the whole thing useful.&lt;/p&gt;
&lt;p&gt;The harness decides what information to give the model. It exposes tools. It executes commands. It reads files. It stores state. It applies permissions and guardrails. It decides what to preserve between model calls and what to discard.&lt;/p&gt;
&lt;p&gt;If you are familiar with software test harnesses, the idea is similar. A unit test does not stand up its own fixtures, organise a test run and collate the report. Other software does that around it.&lt;/p&gt;
&lt;p&gt;This distinction explains something that is easy to miss when the interface looks like a chat window:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the model is not wandering around your computer carrying a mental representation of your project.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The harness repeatedly assembles the information the model needs and places that information into its context.&lt;/p&gt;
&lt;p&gt;And context is where things start getting expensive.&lt;/p&gt;
&lt;h2&gt;Context is working memory, not a filing cabinet&lt;/h2&gt;
&lt;p&gt;When you use ChatGPT, Claude or Copilot in an ordinary conversation, it feels as though the AI remembers what you told it.&lt;/p&gt;
&lt;p&gt;What is actually happening is less magical.&lt;/p&gt;
&lt;p&gt;For each new inference, the application gives the model the relevant conversation and any other information it needs. That may include earlier messages, system instructions, retrieved documents, tool results and summaries of material that no longer fits comfortably into the available context.&lt;/p&gt;
&lt;p&gt;The model has not secretly trained itself on your conversation. The application is giving it the information again.&lt;/p&gt;
&lt;p&gt;All of that information occupies the model’s &lt;strong&gt;context window&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For ordinary workplace chat, this can stay manageable for quite a while.&lt;/p&gt;
&lt;p&gt;Suppose you have a reasonably substantial conversation containing about 3,000 words. That might amount to roughly 4,000 tokens.&lt;/p&gt;
&lt;p&gt;A token is simply one of the units in which LLM input and output are measured. The conversion between words and tokens varies, but the exact number is not important here.&lt;/p&gt;
&lt;p&gt;Now compare that with code.&lt;/p&gt;
&lt;p&gt;Imagine a modest project containing 30 source files averaging 150 lines each. If those lines average around eight tokens, the source alone contains roughly:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;30 files × 150 lines × 8 tokens = 36,000 tokens&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Already about nine times our substantial workplace conversation.&lt;/p&gt;
&lt;p&gt;And source code is only part of what an agentic coding session may need.&lt;/p&gt;
&lt;p&gt;The harness can also feed the model your instructions, specifications, configuration, search results, documentation, test code, compiler errors, stack traces and shell output.&lt;/p&gt;
&lt;p&gt;One failed build can generate thousands of tokens in seconds.&lt;/p&gt;
&lt;p&gt;The agent then searches for the cause, reads another five files, calls the model again, edits the code, reruns the tests and feeds the new results back into the process.&lt;/p&gt;
&lt;p&gt;You might have typed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fix the login bug.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those four words can initiate tens of thousands of tokens of model activity.&lt;/p&gt;
&lt;p&gt;This is why counting prompts tells you almost nothing about how much work an agentic tool is actually doing.&lt;/p&gt;
&lt;p&gt;More importantly, it explains why preserving one enormous coding conversation is usually a bad idea.&lt;/p&gt;
&lt;h2&gt;Stop trying to preserve one immortal conversation&lt;/h2&gt;
&lt;p&gt;Ordinary AI chat rewards continuity.&lt;/p&gt;
&lt;p&gt;You spend half an hour explaining a problem. The conversation gets better as you add information. Starting again feels wasteful because you would have to reconstruct everything the model needs to know.&lt;/p&gt;
&lt;p&gt;That trains you to value the conversation itself.&lt;/p&gt;
&lt;p&gt;Agentic coding sessions accumulate a different kind of material.&lt;/p&gt;
&lt;p&gt;Imagine you are building a small arcade game. First you implement player movement. Then enemies. Then scoring.&lt;/p&gt;
&lt;p&gt;During those jobs the agent searches the repository, reads files, encounters failed tests, follows dead ends, tries an approach you reject, fixes bugs in its first attempt and discusses features you ultimately decide not to build.&lt;/p&gt;
&lt;p&gt;Eventually you start the next piece of work.&lt;/p&gt;
&lt;p&gt;Your session now contains two very different things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;information about the current state of the project;&lt;/li&gt;
&lt;li&gt;the entire history of how you arrived there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first is useful.&lt;/p&gt;
&lt;p&gt;Much of the second is not.&lt;/p&gt;
&lt;p&gt;Yesterday’s stack trace does not become more valuable because you keep sending it back to the model. Neither does the abandoned implementation, the solved bug or the discussion about a feature you decided against.&lt;/p&gt;
&lt;p&gt;Treat the conversation as &lt;strong&gt;working memory&lt;/strong&gt;, not project storage.&lt;/p&gt;
&lt;p&gt;When a coherent piece of work finishes, extract the knowledge that needs to survive.&lt;/p&gt;
&lt;p&gt;Then clear the working context.&lt;/p&gt;
&lt;p&gt;If clearing the conversation would destroy an important project decision, that decision is stored in the wrong place.&lt;/p&gt;
&lt;h2&gt;Put project knowledge in the project&lt;/h2&gt;
&lt;p&gt;You do not need an elaborate knowledge-management system.&lt;/p&gt;
&lt;p&gt;Markdown files in the repository are enough.&lt;/p&gt;
&lt;p&gt;For a small project:&lt;/p&gt;
&lt;p&gt;docs/&lt;br /&gt;
decisions.md&lt;br /&gt;
specs/&lt;br /&gt;
scoring.md&lt;br /&gt;
multiplayer.md&lt;/p&gt;
&lt;p&gt;Suppose you decide to use SQLite instead of storing application state in JSON files.&lt;/p&gt;
&lt;p&gt;Put that decision somewhere durable:&lt;/p&gt;
&lt;p&gt;# Save-game storage&lt;br /&gt;
Decision: Use SQLite.&lt;br /&gt;
Reason: We need structured queries and reliable updates across related records.&lt;br /&gt;
Rejected: JSON files, because concurrent updates would require additional locking logic.&lt;/p&gt;
&lt;p&gt;Notice what you are preserving.&lt;/p&gt;
&lt;p&gt;Not the twenty-minute argument with the model.&lt;/p&gt;
&lt;p&gt;The outcome.&lt;/p&gt;
&lt;p&gt;The reasoning somebody will need later.&lt;/p&gt;
&lt;p&gt;And, where useful, the rejected alternative that somebody will inevitably suggest again six months from now.&lt;/p&gt;
&lt;p&gt;The same principle applies to different kinds of project knowledge.&lt;/p&gt;
&lt;p&gt;A project-wide architectural decision belongs in a decision record.&lt;/p&gt;
&lt;p&gt;The behaviour of a feature belongs in its specification.&lt;/p&gt;
&lt;p&gt;A requirement the software can verify belongs in a test.&lt;/p&gt;
&lt;p&gt;A standing instruction that changes how an agent should work across the repository belongs in something like CLAUDE.md, AGENTS.md or .github/copilot-instructions.md.&lt;/p&gt;
&lt;p&gt;Put information in the narrowest durable place that naturally owns it.&lt;/p&gt;
&lt;p&gt;Do not turn your project instruction file into the repository’s attic.&lt;/p&gt;
&lt;p&gt;If the database choice is in CLAUDE.md, every agent task may have to carry that information whether it needs it or not. If the scoring rules are buried there too, and then the API design, deployment history and meeting notes, you have simply recreated the immortal chat session as a Markdown file.&lt;/p&gt;
&lt;p&gt;Project instruction files are context too.&lt;/p&gt;
&lt;p&gt;Keep them focused on instructions the agent repeatedly needs.&lt;/p&gt;
&lt;h2&gt;Do not let ambiguity quietly become architecture&lt;/h2&gt;
&lt;p&gt;Workplace chat is unusually tolerant of vague instructions.&lt;/p&gt;
&lt;p&gt;You can write:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Make this email more professional.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The model makes some stylistic choices. You read the result and decide whether you like them.&lt;/p&gt;
&lt;p&gt;Software is less forgiving because ambiguity becomes behaviour.&lt;/p&gt;
&lt;p&gt;Suppose you tell an agent:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Add a dash ability to the game.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sounds perfectly reasonable until you ask what “dash” actually means.&lt;/p&gt;
&lt;p&gt;Does the player become invulnerable?&lt;/p&gt;
&lt;p&gt;Can they dash through enemies?&lt;/p&gt;
&lt;p&gt;How long is the cooldown?&lt;/p&gt;
&lt;p&gt;What happens when they hit a wall?&lt;/p&gt;
&lt;p&gt;Can they dash in mid-air?&lt;/p&gt;
&lt;p&gt;Can they change direction during the dash?&lt;/p&gt;
&lt;p&gt;If those decisions are absent, the model still has to produce something.&lt;/p&gt;
&lt;p&gt;So it makes assumptions.&lt;/p&gt;
&lt;p&gt;The danger is not merely that one assumption might be wrong.&lt;/p&gt;
&lt;p&gt;The assumption becomes code.&lt;/p&gt;
&lt;p&gt;Then tests may be written around it. Other features may depend on it. APIs may expose it. Save data may encode it.&lt;/p&gt;
&lt;p&gt;A vague requirement has now become project state.&lt;/p&gt;
&lt;p&gt;The chain looks like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ambiguity → assumption → implementation → dependency → expensive reversal&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So resolve important ambiguity before implementation.&lt;/p&gt;
&lt;p&gt;You do not have to become clairvoyant and write a perfect specification upfront. You do need to make unanswered decisions visible.&lt;/p&gt;
&lt;p&gt;This is where requirements-elicitation workflows become genuinely useful.&lt;/p&gt;
&lt;p&gt;Some agentic setups provide Skills or commands designed specifically to interrogate a vague idea before implementation. They ask the annoying questions a competent business analyst, developer or solutions architect would ask.&lt;/p&gt;
&lt;p&gt;Good.&lt;/p&gt;
&lt;p&gt;Let them be annoying now.&lt;/p&gt;
&lt;p&gt;It is cheaper than discovering the missing requirement after the database schema, API and UI all depend on the wrong answer.&lt;/p&gt;
&lt;p&gt;Once those questions are resolved, move the result out of the conversation and into the specification.&lt;/p&gt;
&lt;p&gt;Then implementation can begin.&lt;/p&gt;
&lt;h2&gt;Turn specifications into bounded jobs&lt;/h2&gt;
&lt;p&gt;A specification can still be too large to hand to an agent as one enormous instruction.&lt;/p&gt;
&lt;p&gt;Break it into coherent tasks.&lt;/p&gt;
&lt;p&gt;Think Jira tickets, except they can just as easily be Markdown files in a tasks/, tickets/ or issues/ directory.&lt;/p&gt;
&lt;p&gt;Each task should let the agent answer three questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What should change?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What constraints must remain true?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What evidence proves the task is complete?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That third question is the one people most often forget.&lt;/p&gt;
&lt;p&gt;“Implement authentication” is a task description.&lt;/p&gt;
&lt;p&gt;“Implement authentication, preserve the existing session API, reject expired credentials, pass the authentication test suite and introduce no new linter errors” is a job the agent can actually reason about completing.&lt;/p&gt;
&lt;p&gt;Clear boundaries reduce the amount of repository the agent needs to consider and reduce the number of decisions it has to invent.&lt;/p&gt;
&lt;p&gt;You are not trying to describe the entire project every time you ask for work.&lt;/p&gt;
&lt;p&gt;You are creating the smallest useful envelope around the job.&lt;/p&gt;
&lt;h2&gt;Keep noisy exploration away from implementation&lt;/h2&gt;
&lt;p&gt;Agentic coding tools spend a remarkable amount of time finding things.&lt;/p&gt;
&lt;p&gt;Ask for one small change and the agent may search the repository, open twelve files, chase a reference into a dead end, read old tests and inspect configuration before discovering the two facts it actually needed.&lt;/p&gt;
&lt;p&gt;Imagine that investigation consumes 20,000 tokens but the useful result is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Authentication is handled in&lt;/em&gt; &lt;em&gt;auth/session.py.&lt;br /&gt;
The current user is available through&lt;/em&gt; &lt;em&gt;request.user.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The implementation task needs those facts.&lt;/p&gt;
&lt;p&gt;It does not need the other 19,900 tokens of exploration.&lt;/p&gt;
&lt;p&gt;This is one reason subagents can be useful.&lt;/p&gt;
&lt;p&gt;Give a separate agent a noisy investigative task and let it return a compact result:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Investigate how authentication works. Return only the components that need modification, the relevant tests and any constraints the implementation must preserve.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The exploration happens in one context.&lt;/p&gt;
&lt;p&gt;The findings move into another.&lt;/p&gt;
&lt;p&gt;That suggests a broader rule:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;match the lifetime of the context to the lifetime of the information.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Repository exploration may only be useful for five minutes.&lt;/p&gt;
&lt;p&gt;Implementation context may need to survive for the duration of one ticket.&lt;/p&gt;
&lt;p&gt;Architectural decisions may need to survive for years.&lt;/p&gt;
&lt;p&gt;Tests may remain useful for the lifetime of the software.&lt;/p&gt;
&lt;p&gt;Do not keep all of those things in one bucket simply because a chat interface makes that convenient.&lt;/p&gt;
&lt;h2&gt;Make the machine prove it worked&lt;/h2&gt;
&lt;p&gt;With ordinary workplace AI, you are usually the verifier.&lt;/p&gt;
&lt;p&gt;Copilot drafts an email. You read it.&lt;/p&gt;
&lt;p&gt;Claude summarises a document. You compare the result with the source.&lt;/p&gt;
&lt;p&gt;Agentic coding gives you an opportunity to automate part of that verification.&lt;/p&gt;
&lt;p&gt;This is where Test-Driven Development suddenly starts looking rather fashionable again.&lt;/p&gt;
&lt;p&gt;Suppose our dash feature has four requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The dash has a one-second cooldown.&lt;/li&gt;
&lt;li&gt;The player cannot dash through walls.&lt;/li&gt;
&lt;li&gt;Existing movement still works.&lt;/li&gt;
&lt;li&gt;Automated tests cover the new behaviour.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now the agent has something better than a vague notion of completion.&lt;/p&gt;
&lt;p&gt;It can change the code, run the tests, inspect failures, modify the implementation and run them again.&lt;/p&gt;
&lt;p&gt;The important principle is broader than TDD.&lt;/p&gt;
&lt;p&gt;Before handing over substantial work, ask:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What observable result would demonstrate that this works?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then give the agent access to that check wherever possible.&lt;/p&gt;
&lt;p&gt;That might mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;unit tests;&lt;/li&gt;
&lt;li&gt;integration tests;&lt;/li&gt;
&lt;li&gt;a successful build;&lt;/li&gt;
&lt;li&gt;type checking;&lt;/li&gt;
&lt;li&gt;linting;&lt;/li&gt;
&lt;li&gt;an API request with an expected response;&lt;/li&gt;
&lt;li&gt;comparison against a known fixture;&lt;/li&gt;
&lt;li&gt;a performance threshold;&lt;/li&gt;
&lt;li&gt;generated output that can be inspected automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The mechanism depends on the task. The principle does not.&lt;/p&gt;
&lt;p&gt;If the only evidence that the work is complete is the model saying “done”, you have not verified the work.&lt;/p&gt;
&lt;p&gt;You have received a status update from the thing whose work you are supposed to be checking.&lt;/p&gt;
&lt;h2&gt;Separate implementation from review&lt;/h2&gt;
&lt;p&gt;Suppose an agent spends a substantial session implementing a feature.&lt;/p&gt;
&lt;p&gt;During that session it sees every assumption, failed attempt, workaround and correction involved in producing the final code.&lt;/p&gt;
&lt;p&gt;Then, at the end, you ask:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Review your work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is better than nothing, but it is not much separation between implementation and evaluation.&lt;/p&gt;
&lt;p&gt;For complex or important changes, start a clean session.&lt;/p&gt;
&lt;p&gt;Give the reviewer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the specification;&lt;/li&gt;
&lt;li&gt;the resulting code changes;&lt;/li&gt;
&lt;li&gt;the test results;&lt;/li&gt;
&lt;li&gt;any constraints that should have been preserved.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then ask it to find requirement violations, missing cases, unnecessary changes and questionable assumptions.&lt;/p&gt;
&lt;p&gt;The clean reviewer has not followed the implementation process step by step. It sees the result against the requirements rather than inheriting every justification made along the way.&lt;/p&gt;
&lt;p&gt;This does not magically make the reviewer unbiased.&lt;/p&gt;
&lt;p&gt;It simply removes one source of correlated reasoning between the person — or model — that created something and the process used to evaluate it.&lt;/p&gt;
&lt;p&gt;Software engineering discovered a long time ago that separating generation from evaluation tends to be useful.&lt;/p&gt;
&lt;p&gt;Agentic coding has not repealed that idea.&lt;/p&gt;
&lt;h2&gt;Use project instruction files for instructions&lt;/h2&gt;
&lt;p&gt;Sooner or later you will encounter files such as:&lt;/p&gt;
&lt;p&gt;CLAUDE.md&lt;br /&gt;
AGENTS.md&lt;br /&gt;
.github/copilot-instructions.md&lt;/p&gt;
&lt;p&gt;These are project instruction files.&lt;/p&gt;
&lt;p&gt;Compatible tools load them to understand how they should work inside the repository.&lt;/p&gt;
&lt;p&gt;Useful contents might include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how to run the tests;&lt;/li&gt;
&lt;li&gt;which package manager the project uses;&lt;/li&gt;
&lt;li&gt;directories that contain generated files and must not be edited manually;&lt;/li&gt;
&lt;li&gt;formatting or naming conventions that apply across the codebase;&lt;/li&gt;
&lt;li&gt;important commands an agent needs repeatedly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ordinary project knowledge does not belong there merely because the agent reads the file automatically.&lt;/p&gt;
&lt;p&gt;A decision to use OAuth rather than local passwords is a project decision.&lt;/p&gt;
&lt;p&gt;The instruction “never manually edit files under generated/” changes how the agent should behave on many tasks, so that belongs in the project instruction file.&lt;/p&gt;
&lt;p&gt;Again, context has a cost.&lt;/p&gt;
&lt;p&gt;A bloated instruction file gets dragged into work that may have nothing to do with most of its contents.&lt;/p&gt;
&lt;p&gt;Do not solve context management by creating a giant file that automatically pollutes every new context.&lt;/p&gt;
&lt;h2&gt;What I would do on day one&lt;/h2&gt;
&lt;p&gt;Pick a real project you care enough about to finish but can afford to break.&lt;/p&gt;
&lt;p&gt;Build a tiny game.&lt;/p&gt;
&lt;p&gt;Create a personal website.&lt;/p&gt;
&lt;p&gt;Automate some tedious admin.&lt;/p&gt;
&lt;p&gt;Write a little utility that saves you ten minutes every week.&lt;/p&gt;
&lt;p&gt;Then use the agentic coding tool for one clearly bounded task and actually watch what it does.&lt;/p&gt;
&lt;p&gt;Notice which files it reads.&lt;/p&gt;
&lt;p&gt;Watch the commands it executes.&lt;/p&gt;
&lt;p&gt;Look at how much output a failed build produces.&lt;/p&gt;
&lt;p&gt;Notice how much activity can follow from one short instruction.&lt;/p&gt;
&lt;p&gt;Create a docs/ directory early.&lt;/p&gt;
&lt;p&gt;Give project decisions somewhere durable to live.&lt;/p&gt;
&lt;p&gt;Give substantial features specifications.&lt;/p&gt;
&lt;p&gt;When a conversation produces information the project needs to remember, move that information into the repository.&lt;/p&gt;
&lt;p&gt;Before implementation, resolve the decisions that would otherwise be guessed.&lt;/p&gt;
&lt;p&gt;Break larger specifications into bounded jobs.&lt;/p&gt;
&lt;p&gt;Give each job observable completion criteria.&lt;/p&gt;
&lt;p&gt;Use separate contexts for noisy investigation where it helps.&lt;/p&gt;
&lt;p&gt;Run automated checks.&lt;/p&gt;
&lt;p&gt;Review important changes from a clean session.&lt;/p&gt;
&lt;p&gt;Then clear the old working context and move on.&lt;/p&gt;
&lt;p&gt;Only add elaborate Skills, subagents, orchestration frameworks and multi-agent workflows once you have experienced the failures they actually prevent.&lt;/p&gt;
&lt;p&gt;Do not begin by constructing an artificial intelligence bureaucracy around a three-file Python project.&lt;/p&gt;
&lt;p&gt;Learn the failure modes first.&lt;/p&gt;
&lt;h2&gt;The habit that actually needs to change&lt;/h2&gt;
&lt;p&gt;Workplace AI taught us to treat the conversation as the product.&lt;/p&gt;
&lt;p&gt;We keep adding context, refining instructions and preserving the thread because the thread is where the useful information lives.&lt;/p&gt;
&lt;p&gt;Agentic coding changes that relationship.&lt;/p&gt;
&lt;p&gt;The project now exists outside the conversation.&lt;/p&gt;
&lt;p&gt;The code exists outside it.&lt;/p&gt;
&lt;p&gt;The specifications exist outside it.&lt;/p&gt;
&lt;p&gt;The decisions exist outside it.&lt;/p&gt;
&lt;p&gt;The tests exist outside it.&lt;/p&gt;
&lt;p&gt;The conversation is temporary working space around those things.&lt;/p&gt;
&lt;p&gt;Once you understand that, most of the other advice stops looking like a collection of arbitrary best practices.&lt;/p&gt;
&lt;p&gt;Of course you clear old sessions.&lt;/p&gt;
&lt;p&gt;Of course decisions need a durable home.&lt;/p&gt;
&lt;p&gt;Of course tasks need boundaries.&lt;/p&gt;
&lt;p&gt;Of course noisy investigations can be isolated.&lt;/p&gt;
&lt;p&gt;Of course the agent needs a way to prove its work.&lt;/p&gt;
&lt;p&gt;You are no longer trying to maintain the perfect conversation.&lt;/p&gt;
&lt;p&gt;You are trying to get work done reliably.&lt;/p&gt;
</content:encoded></item><item><title>The C2 Trap</title><link>https://blog.sploitable.com/articles/the-c2-trap/</link><guid isPermaLink="true">https://blog.sploitable.com/articles/the-c2-trap/</guid><description>Detection engineering should start at the beginning of an attack, not the end. Why chasing C2 traffic is a trap.</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Start at the Beginning. Not at the End&lt;/h2&gt;
&lt;p&gt;“Let’s start at the very beginning. A very good place to start.”&lt;/p&gt;
&lt;p&gt;That applies to detection engineering too.&lt;/p&gt;
&lt;p&gt;Time and time again I’ve seen security teams prioritise command-and-control (C2) and data exfiltration far too early. These are serious attacker actions. They feel important. They sound advanced. They seem like the kind of thing a good SOC should be doing.&lt;/p&gt;
&lt;p&gt;For most teams, this is a mistake.&lt;/p&gt;
&lt;p&gt;I do not think most detection programs should start by trying to detect C2 or exfiltration. In fact, I think many teams should not spend much time on them at all until they have built stronger coverage elsewhere.&lt;/p&gt;
&lt;p&gt;Why? Because C2 and exfiltration are hard problems.&lt;/p&gt;
&lt;h2&gt;Pick Your Battles&lt;/h2&gt;
&lt;p&gt;The first mistake that teams make is to treat C2 and exfiltration as if they are specific behaviours. They are not. They are outcomes.&lt;/p&gt;
&lt;p&gt;The attacker’s goal is to establish a reliable outbound path, or to get data out of your network by any means necessary. That can mean HTTPS, DNS, cloud storage, remote admin tools, SaaS platforms, email, collaboration tools, or traffic that appears indistinguishable from ordinary business activity.&lt;/p&gt;
&lt;p&gt;The attacker only needs one working method.&lt;/p&gt;
&lt;p&gt;The defender has to spot all plausible methods.&lt;/p&gt;
&lt;p&gt;That is the trap.&lt;/p&gt;
&lt;p&gt;(cliché narrowly avoided, phew)&lt;/p&gt;
&lt;p&gt;This is an asymmetry problem. The defender must cover a huge space. In a large enterprise, with high volumes of business traffic, user behaviour, and a multitude of endpoint software producing endless noise, that is not a battle that most teams are going to win.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-1.DRsOEWNo.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Yes, &lt;em&gt;some&lt;/em&gt; organisations &lt;em&gt;might&lt;/em&gt; be able to do this with highly restrictive egress controls, telemetry from a broad spectrum of network protocols, and non-trivial machine-learning-based analytics. But &lt;em&gt;most&lt;/em&gt; teams do not have that. Even if they do, C2 and exfil remain some of the hardest detection problems to solve. Why would any sane person choose to start there?!&lt;/p&gt;
&lt;p&gt;If someone &lt;em&gt;has&lt;/em&gt; miraculously “solved C2” then they are keeping very quiet about it. Given that such a person would almost certainly become an over night millionaire, I think it’s safe to say the game remains firmly afoot.&lt;/p&gt;
&lt;h2&gt;Focus on High Signal&lt;/h2&gt;
&lt;p&gt;Attacks do not begin with stealthy outbound traffic. They begin with, well, initial execution, persistence, credential access, lateral movement. Activities that tend to result in relatively stronger detection signals than C2 and exfil.&lt;/p&gt;
&lt;p&gt;For example. Before an attacker can establish a stable C2 channel or exfil your customer data, they need to do things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;execute suspicious binaries or scripts&lt;/li&gt;
&lt;li&gt;abuse Office, browsers, or script interpreters&lt;/li&gt;
&lt;li&gt;tamper with security tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are much better starting points because there is far less scope for variation. Theoretically there are infinite ways you can do C2, whereas there are a finite number of ways to dump creds from LSASS. Finite and ever-growing, but finite nonetheless.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.sploitable.com/_astro/img-2.FKUxoNhd.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A good starting detection is one that gives you a strong signal, clear investigative value, and a realistic chance to intervene &lt;em&gt;before&lt;/em&gt; the damage is done.&lt;/p&gt;
&lt;h2&gt;Too Little Too Late&lt;/h2&gt;
&lt;p&gt;Its not just that C2 and exfil are hard. It is that they are too late.&lt;/p&gt;
&lt;p&gt;If your first meaningful alert is C2, the attacker has already executed code and established control. You have bigger problems to worry about.&lt;/p&gt;
&lt;p&gt;If your first meaningful alert is exfiltration, the attacker may already have gained access, obtained credentials, moved laterally, reached important systems, collected data, staged it, and started moving it out. You &lt;em&gt;definitely&lt;/em&gt; have bigger problems to worry about.&lt;/p&gt;
&lt;p&gt;At that point, you will not be asking, “Can we detect this?”&lt;/p&gt;
&lt;p&gt;You will be asking, “Why are we only detecting this now?”&lt;/p&gt;
&lt;p&gt;That is not a good place to be.&lt;/p&gt;
&lt;p&gt;The kill chain matters, because detection is in part a timing problem. The later you detect, the worse things get. With exfiltration, the data loss event may already have happened.&lt;/p&gt;
&lt;p&gt;This does not make late detections useless. It makes them weak candidates for your first and best line of defence.&lt;/p&gt;
&lt;h2&gt;Where Most Teams Should Start&lt;/h2&gt;
&lt;p&gt;A team with weak coverage of suspicious execution, credential access, and lateral movement should not be spending their efforts trying to infer beaconing activity from marginal network signals across a noisy environment.&lt;/p&gt;
&lt;p&gt;A good detection program asks simple questions first:&lt;/p&gt;
&lt;p&gt;Where is the signal strongest?&lt;br /&gt;
Where are attacker options narrowest?&lt;br /&gt;
Where can we investigate with confidence?&lt;br /&gt;
Where can we detect earlier?&lt;br /&gt;
Where can we still change the outcome?&lt;/p&gt;
&lt;p&gt;For most teams, the answer is not C2.&lt;/p&gt;
&lt;p&gt;Focus your efforts on areas like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;suspicious execution chains&lt;/li&gt;
&lt;li&gt;script interpreter abuse&lt;/li&gt;
&lt;li&gt;Office or browser child-process anomalies&lt;/li&gt;
&lt;li&gt;abuse of admin tooling&lt;/li&gt;
&lt;li&gt;credential access&lt;/li&gt;
&lt;li&gt;interactions with LSASS&lt;/li&gt;
&lt;li&gt;authentication anomalies&lt;/li&gt;
&lt;li&gt;privilege escalation&lt;/li&gt;
&lt;li&gt;remote execution&lt;/li&gt;
&lt;li&gt;lateral movement primitives&lt;/li&gt;
&lt;li&gt;security control tampering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not trivial detection problems. However, they are usually &lt;em&gt;better&lt;/em&gt; detection problems. They are more tightly bounded and more likely to catch an attacker while they are still forced to do something noisy or unusual.&lt;/p&gt;
&lt;p&gt;Jumping straight to C2 means placing your bets on catching the attacker at one of the quietest, most flexible stages in the kill chain.&lt;/p&gt;
&lt;h2&gt;Someday, Somehow&lt;/h2&gt;
&lt;p&gt;I am not saying C2 and exfiltration detections are worthless.&lt;/p&gt;
&lt;p&gt;They are not.&lt;/p&gt;
&lt;p&gt;In restricted environments, crown-jewel enclaves, mature programs, or networks with tight egress control and rich telemetry, they can be useful. In some cases essential.&lt;/p&gt;
&lt;p&gt;But they should be regarded as the roof not the foundations.&lt;/p&gt;
&lt;p&gt;For most teams, they are a poor starting point. They are not where the early returns are. They are not where the analyst learns fastest. They are not where the defender has the advantage.&lt;/p&gt;
&lt;h2&gt;Start at the Beginning&lt;/h2&gt;
&lt;p&gt;C2 and exfiltration are tempting because they sit close to the attacker’s objective. But that is exactly why they are such dangerous starting points. By then the attacker has more options, more cover, and less need to behave in ways you can reliably spot.&lt;/p&gt;
&lt;p&gt;Start earlier.&lt;/p&gt;
&lt;p&gt;Detect initial execution.&lt;br /&gt;
Detect credential access.&lt;br /&gt;
Detect lateral movement.&lt;/p&gt;
&lt;p&gt;Because if your first alert is “elvis.dit has left the building” then its so long, farewell&lt;br /&gt;
auf wiedersehen, goodbye.&lt;/p&gt;
</content:encoded></item></channel></rss>