<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ajay Nyayapathi</title>
    <description>The latest articles on DEV Community by Ajay Nyayapathi (@nvajay).</description>
    <link>https://dev.to/nvajay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4121569%2F47f80bf1-9eee-4b8f-a47b-00f11af67ac9.png</url>
      <title>DEV Community: Ajay Nyayapathi</title>
      <link>https://dev.to/nvajay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nvajay"/>
    <language>en</language>
    <item>
      <title>I Taught My AI Agent to Write YARA-L Rules That Actually Compile</title>
      <dc:creator>Ajay Nyayapathi</dc:creator>
      <pubDate>Sun, 25 Oct 2026 13:06:09 +0000</pubDate>
      <link>https://dev.to/nvajay/i-taught-my-ai-agent-to-write-yara-l-rules-that-actually-compile-542n</link>
      <guid>https://dev.to/nvajay/i-taught-my-ai-agent-to-write-yara-l-rules-that-actually-compile-542n</guid>
      <description>&lt;p&gt;Ask a general AI model to write a YARA-L rule and you will usually get something that looks right and fails in the Rules Editor.&lt;/p&gt;

&lt;p&gt;These five mistakes show up again and again:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;metadata.event_type = "LOGIN"&lt;/strong&gt;. That value doesn't exist. The enum is USER_LOGIN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;target.port = "443"&lt;/strong&gt;. Port is an integer. Quoting it fails type checking.&lt;/li&gt;
&lt;li&gt;Two event variables with no shared placeholder in &lt;strong&gt;match&lt;/strong&gt;. The rule either won't compile or joins everything to everything.&lt;/li&gt;
&lt;li&gt;Raw event fields in &lt;strong&gt;outcome&lt;/strong&gt; inside a rule that has a match section. Every one needs an aggregate like &lt;strong&gt;count()&lt;/strong&gt; or &lt;strong&gt;array_distinct()&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Invented UDM fields. The model guesses a field name that sounds plausible and isn't in your parser's output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these are hard problems. They're the kind of thing a senior detection engineer catches in review. The model just doesn't know the rules of the language well enough, and it has no way to check its own work.&lt;/p&gt;

&lt;p&gt;So I wrote those rules down and packaged them as an Agent Skill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/ajaynyayapathi/yara-l-skill" rel="noopener noreferrer"&gt;https://github.com/ajaynyayapathi/yara-l-skill&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What an Agent Skill is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A skill is a folder with a &lt;strong&gt;SKILL.md&lt;/strong&gt; file in it. The file holds instructions the agent loads only when a task matches its description. You can add reference docs, examples, and scripts alongside it.&lt;/p&gt;

&lt;p&gt;Anthropic released the format as an open standard in December 2025. The spec lives at agentskills.io, and Claude Code, GitHub Copilot, OpenAI Codex, Gemini CLI, and Cursor all read it. Write the skill once and it works across all of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this skill does&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Give your agent a threat description, an ATT&amp;amp;CK technique, a Sigma rule, or an SPL/KQL query. It follows an 8 step workflow and returns six things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The detection logic in one sentence&lt;/li&gt;
&lt;li&gt;A complete YARA-L 2.0 rule with full &lt;strong&gt;meta, outcome&lt;/strong&gt;, and &lt;strong&gt;$risk_score&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A list of UDM fields you need to verify against your own parser&lt;/li&gt;
&lt;li&gt;The reference lists and data tables to create, with sample rows&lt;/li&gt;
&lt;li&gt;One test case that should fire and one that should not&lt;/li&gt;
&lt;li&gt;The two most likely false positive sources and how to tune them out&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Item 3 matters most. Parsers differ in which UDM fields they fill and which values they write. A failed login might land as &lt;strong&gt;BLOCK&lt;/strong&gt; in one feed and &lt;strong&gt;FAIL&lt;/strong&gt; in another. The skill marks every uncertain field with a &lt;strong&gt;// VERIFY&lt;/strong&gt;: comment instead of guessing, so you know exactly what to check before you deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A real example: device code phishing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In February 2025 Microsoft reported that Storm-2372 had been running device code phishing campaigns against governments, NGOs, and defense, energy, and telecom organizations. The attacker sends a fake Teams meeting invite. The victim enters a code on the real Microsoft login page. The attacker walks away with valid tokens, and MFA never had a chance to stop it.&lt;/p&gt;

&lt;p&gt;Here's the rule the skill produces for "alert on device code sign ins from users outside an approved list":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yara
rule entra_device_code_signin_unapproved_user {

  meta:
    author = "community"
    description = "Successful OAuth device code sign in by an account not approved for device code flow."
    severity = "HIGH"
    priority = "HIGH"
    mitre_attack_tactic = "Credential Access"
    mitre_attack_technique = "T1528"
    reference = "https://attack.mitre.org/techniques/T1528/"
    false_positives = "Azure CLI and PowerShell logins with --use-device-code, conference room and IoT devices."
    rule_version = "1.0"
    yara_version = "YL2.0"

  events:
    $e.metadata.event_type = "USER_LOGIN"
    // VERIFY: confirm log_type for your Entra ID sign in feed.
    $e.metadata.log_type = "AZURE_AD"
    // VERIFY: the field holding authenticationProtocol differs by parser version.
    $e.additional.fields["authenticationProtocol"] = "deviceCode" nocase
    $e.security_result.action = "ALLOW"
    $e.target.user.userid = $user
    not $e.target.user.userid in %device_code_approved_users.userid

  match:
    $user over 1h

  outcome:
    $risk_score = 75
    $risk_entity_to_score = $user
    $signin_count = count($e.metadata.id)
    $source_ips = array_distinct($e.principal.ip)
    $applications = array_distinct($e.target.application)
    $countries = array_distinct($e.principal.location.country_or_region)

  condition:
    $e
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Three choices in this rule are worth pointing out:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The exclusion lives in a data table. Conference rooms and CLI users change every month. Your SOC updates a CSV and never touches the rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;match: $user over 1h&lt;/strong&gt; groups repeat sign ins. One user who signs in five times produces one alert with &lt;strong&gt;$signin_count = 5&lt;/strong&gt;, not five alerts.&lt;/li&gt;
&lt;li&gt;Every outcome field is aggregated. That's required once a match section exists, and it's the mistake models make most often.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The repo ships four example rules, one for each shape you'll write most: single event (&lt;strong&gt;certutil&lt;/strong&gt; downloading a payload), sequence (brute force followed by success), absence (EDR sensor stopped and never came back), and data table lookup (the rule above).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The linter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instructions only get you so far. The agent still needs a way to check its work before you see it.&lt;/p&gt;

&lt;p&gt;The skill includes &lt;strong&gt;lint_rule.py&lt;/strong&gt;, a Python script with no dependencies that catches structural mistakes offline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python3 scripts/lint_rule.py bad_rule.yaral
[FAIL] bad_rule.yaral
  error:   sections out of order: ['events', 'meta', 'outcome', 'condition']; expected order ['meta', 'events', 'match', 'outcome', 'condition', 'options']
  error:   unknown metadata.event_type value "LOGIN"
  error:   integer field ending '.port' compared to a quoted string
  error:   multiple event variables but no match section
  error:   absence condition (!$var) requires a match section
  warning: no $risk_score in outcome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill tells the agent to lint every rule, fix every error, and pass the warnings along to you. When the agent can run code, you get a rule that has already been through one review pass.&lt;/p&gt;

&lt;p&gt;A clean lint result doesn't mean the rule compiles. Only the SecOps compiler can tell you that. The linter catches the cheap mistakes so your time goes to the logic.&lt;/p&gt;

&lt;p&gt;Install it&lt;/p&gt;

&lt;p&gt;Copy one folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash
git clone https://github.com/ajaynyayapathi/yara-l-skill.git
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; yara-l-skill/skills/yara-l-authoring ~/.claude/skills/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent                       Personal               Project
Claude Code               ~/.claude/skills/    .claude/skills/
GitHub Copilot/VS Code       ~/.copilot/skills/   .github/skills/
Codex and other clients      ~/.agents/skills/    .agents/skills/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Claude.ai, zip the &lt;strong&gt;yara-l-authoring&lt;/strong&gt; folder and upload it as a custom skill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then try a prompt like this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write a YARA-L rule for 10 failed logins followed by a success within 30 minutes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How I'd roll out any rule it writes&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save the rule with alerting off.&lt;/li&gt;
&lt;li&gt;Run a retrohunt over the last 7 to 30 days.&lt;/li&gt;
&lt;li&gt;If a medium severity rule produces more than 20 detections a day, tune it before you go further.&lt;/li&gt;
&lt;li&gt;Have an analyst review 10 sample detections.&lt;/li&gt;
&lt;li&gt;Turn on alerting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The skill includes this checklist, so the agent says the same thing every time. AI-written detection content needs the same review gate as human-written content. The skill makes that review faster. It doesn't replace it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contribute&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most useful contributions right now:&lt;/p&gt;

&lt;p&gt;UDM field corrections from parsers you run in production&lt;br&gt;
New example rules, each with a should fire and a should not fire case&lt;br&gt;
New linter checks for mistakes you've seen in review&lt;/p&gt;

&lt;p&gt;Open a PR on the repo. If you run it against your own tenant and a &lt;strong&gt;// VERIFY&lt;/strong&gt;: field turns out wrong for your parser, I want to hear about it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;YARA-L, Google Security Operations, and Chronicle are trademarks of Google LLC. This project is not affiliated with or endorsed by Google.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>agentskills</category>
      <category>ai</category>
      <category>detectionengineering</category>
    </item>
    <item>
      <title>I found an open issue on Google's own security repo, so I built the missing piece</title>
      <dc:creator>Ajay Nyayapathi</dc:creator>
      <pubDate>Sat, 12 Sep 2026 21:02:36 +0000</pubDate>
      <link>https://dev.to/nvajay/i-found-an-open-issue-on-googles-own-security-repo-so-i-built-the-missing-piece-4g1c</link>
      <guid>https://dev.to/nvajay/i-found-an-open-issue-on-googles-own-security-repo-so-i-built-the-missing-piece-4g1c</guid>
      <description>&lt;p&gt;In May 2026, Microsoft's Semantic Kernel shipped two CVEs in the same week. CVE-2026-26030 let an attacker chain a lambda expression into arbitrary code execution through an AI agent's tool-call handling. The fix landed inside 48 hours because a detection rule already existed for it, an open, community-maintained standard called Agent Threat Rules (ATR) had a rule live and merged into Microsoft's own Agent Governance Toolkit within hours of the CVE disclosure.&lt;/p&gt;

&lt;p&gt;ATR has grown fast. 680+ rules, adopted into Microsoft's Agent Governance Toolkit, Cisco AI Defense, MISP, and cross-listed by SigmaHQ as a sibling format to Sigma itself. Think Sigma for SIEM detection, YARA for malware signatures, ATR for AI agent threats: prompt injection, tool poisoning, context exfiltration, skill supply-chain attacks.&lt;/p&gt;

&lt;p&gt;Here's what stopped me: Google Security Operations (Chronicle) had no way to use any of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gap was already documented, just unsolved&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I went looking and found an open issue on Google's own google/mcp-security repository, someone had asked for exactly this: a way to pull external rule packs like ATR into Chronicle through the SecOps MCP server. The issue laid out the shape of the tool needed. Nobody had built the piece it depended on: something that actually translates ATR's rule format into Chronicle's detection language, YARA-L.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;

&lt;p&gt;What atr-to-yaral does&lt;/p&gt;

&lt;p&gt;It's a small Python tool. You point it at an ATR rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;yaml&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Direct Prompt Injection via User Input&lt;/span&gt;
&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ATR-2026-00001&lt;/span&gt;
&lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;high&lt;/span&gt;
&lt;span class="na"&gt;detection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;any&lt;/span&gt;
  &lt;span class="na"&gt;conditions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;content&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;regex&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?i)ignore&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;s+(all&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;s+)?(previous|prior|above)&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;s+instructions"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;content&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;regex&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?i)disregard&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;s+(your|the)&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;s+system&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;s+prompt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it produces a working YARA-L 2.0 rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;rule&lt;/span&gt; &lt;span class="n"&gt;ATR_2026_00001&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;atr_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"ATR-2026-00001"&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"Direct Prompt Injection via User Input"&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"HIGH"&lt;/span&gt;
    &lt;span class="n"&gt;mitre_atlas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"AML.T0051 - LLM Prompt Injection"&lt;/span&gt;
    &lt;span class="k"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"Converted from Agent Threat Rules (ATR)"&lt;/span&gt;

  &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;ignore&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;all&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="k"&gt;prior&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;above&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;disregard&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="k"&gt;system&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;nocase&lt;/span&gt;

  &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Point it at a whole directory of ATR rules and it batch-converts everything it can, skipping and reporting anything outside its current scope rather than failing the whole run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest limitation, stated up front&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ATR rules match against LLM input, tool-call arguments, and SKILL.md content. Chronicle's UDM has no standard field for any of that yet, because there's no standard way to ingest AI agent telemetry into Chronicle today. That's a real, unsolved problem industry-wide, not a gap in this tool specifically.&lt;/p&gt;

&lt;p&gt;The converter defaults to a placeholder UDM field and makes you configure the real one for your ingestion pipeline. I'd rather ship something that says plainly what it doesn't know than something that looks finished and quietly fires on the wrong field forever.&lt;/p&gt;

&lt;p&gt;For the deployment step, once you have .yaral files, I pointed the README at Google's own chronicle/detection-rules tool, content_manager, which validates and pushes rules into a live Chronicle instance. The full path looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ATR YAML rules → atr-to-yaral → .yaral files → content_manager → live in Chronicle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What's next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I opened an integration request on ATR's own repository, and I'm planning to comment on the original Google issue once there's more real-world usage to point to. If you run Chronicle and want to try converting a batch of ATR rules against your own pipeline, I'd genuinely like to hear what breaks.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/ajaynyayapathi/ATR-to-Yara-L-Converter" rel="noopener noreferrer"&gt;https://github.com/ajaynyayapathi/ATR-to-Yara-L-Converter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Currently supports regex-based ATR conditions (the majority of the published rule set) with both AND and OR condition logic. Non-regex operators and multi-event correlation rules are documented as out of scope for now, not silently dropped.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>Gmail AI Threat Scanner: An Open‑Source Security Layer for Your Inbox</title>
      <dc:creator>Ajay Nyayapathi</dc:creator>
      <pubDate>Sat, 12 Sep 2026 01:33:22 +0000</pubDate>
      <link>https://dev.to/nvajay/gmail-ai-threat-scanner-an-open-source-security-layer-for-your-inbox-gfg</link>
      <guid>https://dev.to/nvajay/gmail-ai-threat-scanner-an-open-source-security-layer-for-your-inbox-gfg</guid>
      <description>&lt;p&gt;Email remains the most common entry point for cyberattacks, yet most people rely entirely on whatever built‑in filtering their provider offers. I wanted something more transparent, more customizable, and more aligned with modern AI‑driven threat analysis. So I built Gmail AI Threat Scanner.&lt;/p&gt;

&lt;p&gt;This project connects to your Gmail inbox, analyzes messages using AI‑powered threat detection, and flags suspicious content — all while running locally so you stay in control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;br&gt;
Scans Gmail messages using AI models for phishing, fraud, and social engineering indicators&lt;/p&gt;

&lt;p&gt;Highlights risky emails with clear explanations&lt;/p&gt;

&lt;p&gt;Works entirely client‑side using OAuth (no passwords, no server storage)&lt;/p&gt;

&lt;p&gt;Lets you review threats in a simple, readable interface&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built it&lt;/strong&gt;&lt;br&gt;
I wanted a lightweight, open‑source tool that gives users visibility into potential threats without requiring enterprise‑grade infrastructure. Security shouldn’t be locked behind corporate paywalls — especially when AI can help individuals defend themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roadmap&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add multi‑model ensemble scoring&lt;/li&gt;
&lt;li&gt;Add attachment scanning&lt;/li&gt;
&lt;li&gt;Learning from False Positives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repo&lt;/strong&gt;&lt;br&gt;
🔗 &lt;a href="https://github.com/ajaynyayapathi/Gmail-AI-Threat-Scanner" rel="noopener noreferrer"&gt;https://github.com/ajaynyayapathi/Gmail-AI-Threat-Scanner&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it, I’d love feedback, issues, or PRs.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>cybersecurity</category>
    </item>
  </channel>
</rss>
