یک گویش یکپارچه و کاربرپسند برای Kusto (KQL) که شکار تهدیدهای امنیتی را سریعتر، سازگارتر و خواناتر میسازد.

با خوشحالی معرفی میکنم IRQL — مجموعهای از توابع Kusto که برای پنهانکردن آشفتگی لاگهای امنیتی گوناگون و ارائه تجربهای تمیز و بیانگر هدف در کوئریها طراحی شدهاند.
این زبان توسط سار ران، جان لمبرت و دیانا دامنووا ساخته شده است و کوئریهای طولانی و شکنندهی KQL را به خطوط لولهای خوانا، قابل استفادهی مجدد و قابل درک برای انسانها و مدلهای زبانی (LLMها)
تلمتری امنیتی بهطور ذاتی آشفته و نامنظم است:
یک مفهوم واحد ممکن است با دهها نام ستون مختلف ظاهر شود (ipAddress، ClientIp، callerIpAddress و…).
جدولها در کلاسترها و دیتابیسهای متفاوتی قرار دارند.
الگوهای تکراری join و enrichment مدام کپی میشوند و با تغییر اسکیما بهراحتی از کار میافتند.
کوئریها طولانی، سخت برای بازبینی و از نظر ذهنی پرهزینه میشوند.
IRQL این مشکل را با پنهان کردن جزئیات فنی پشت توابع معنایی و پایدار حل میکند. نتیجه:
اسکیما یکپارچه (EnvTime، ClientIp، Username، Hostname، Url و غیره)
سلکتورهای قابلاستفاده مجدد که میدانند دادهها کجا هستند و چگونه باید join شوند
نامهای مبتنی بر نیت مانند Get_Event_SignIn، Extract_Email_Sender_Domain، Enrich_Ip_Employee
ترکیبپذیری روان با تحلیلهای جدولی و گرافمحور (از طریق توابع Lift-To-Graph)
نتیجه نهایی چیست؟ یادگیری سریعتر، خطاهای کمتر، پشتیبانی بهتر از کوئرینویسی با کمک هوش مصنوعی، و شکار تهدیداتی که بیشتر شبیه یک روایت هستند تا یک اسکریپت.
تفاوت در عمل — شناسایی اپلیکیشنهایی که دستههای جدیدی از user-agent را مشاهده میکنند (نشانهای از سرقت توکن یا فعالیت AiTM):
نسخه خام KQL (طولانی، مکانیکی، شامل منطق درونخطی و joinهای متعدد)
(~۶۰ خط شامل یک طبقهبند بزرگ user-agent، unionهای دستی، چندین بازه زمانی و joinهای صریح)
نسخه IRQL (تمیز، خوانا، حدود ۱۵ خط):
let minimumAppThreshold = 100; let timeframe = 1d; let lookback = 7d; let SignInsToday = Get_Event_SignIn(timeframe, 0d); let SignInsBaseline = Get_Event_SignIn(lookback + timeframe, timeframe); let Baseline = SignInsBaseline | invoke Extract_SignIn_UserAgent_Category() | summarize RequestCount = count() by AppId, AppDisplayName, UserAgentCategory; SignInsToday | invoke Extract_SignIn_UserAgent_Category() | invoke Enrich_App_New_UserAgent_Category(Baseline, minimumAppThreshold) | project EnvTime, Username, AppDisplayName, AppId, UserAgentCategory, UserAgent, BaselineCategories | summarize count() by Username, AppDisplayName, AppId, UserAgentCategory, UserAgent
همان منطق — با وضوح نیت بهمراتب بیشتر.
IRQL توابع را در گروههای مشخصی سازماندهی میکند:
تابع All_*_Selectors (Get_ / Get— دادهها را از جدولهای منبع با یک اسکیما یکنواخت و استاندارد استخراج میکنند.
تابع Extractors (Extract_*) — ستونهای جدیدی مشتق میکنند (مثلاً استخراج دامنه از URL یا ایمیل).
تابع Enrichers (Enrich_*) — اطلاعات تکمیلی مانند دادههای کارمندان یا رویدادهای شبکه را بهصورت left join اضافه میکنند.
نسخههای گراف (Extract_Node_، Enrich_Node_، Enrich_Graph_*) — همان قابلیتها، اما اینبار روی گرافهایی که توسط توابع Lift_To_Graph ساخته شدهاند.
غنیسازی خارجی — شامل گزارشهای فایل از VirusTotal و فهرست آسیبپذیریهای شناختهشده و مورد سوءاستفاده CISA، آماده برای استفاده.
این مجموعه شامل چندین مثال کامل (end-to-end) روی دیتاستهای عمومی KC7 (JoJo’s Hospital / Valdy Times) است:
تحلیل کمپین فیشینگ بر اساس رتبه سازمانی گیرندگان
بررسی فعالیتهای پس از نفوذ (post-exploitation) از یک فایل مخرب
تحلیل دامنههای مشکوک بهصورت گراف تعاملی
این مثالها نشان میدهند که IRQL چگونه بهصورت طبیعی به کوئریهای قدرتمند و قابل نگهداری زنجیره میشود.
این توابع بهصورت زنده روی دیتاستهای باز KC7 در دسترس هستند:
Databases: JoJosHospital و ValdyTimes
میتوانید کل کاتالوگ، تعریف توابع و مثالها را مستقیماً از Gist کپی کنید:
IRQL.md در GitHub
این ابزار همچنین بهخوبی با توابع مکمل Lift to Graph برای تحلیلهای بصری ترکیب میشود.
IRQL طوری طراحی شده که بهعنوان یک زبان مشترک رشد کند. آن را در محیط خود پیادهسازی کنید، با منابع داده خود گسترش دهید، و به ساخت زبانی یکپارچهتر برای عملیات امنیتی کمک کنید.
تشکر ویژه از نویسندگان برای متنباز کردن این پروژه — این یک گام واقعی رو به جلو برای مقیاسپذیر و قابلدسترس کردن شکار تهدید است.
نظر شما چیست؟ دیدگاهها، سوالها یا اولین کوئریهای IRQL خود را در بخش نظرات به اشتراک بگذارید. بیایید تحلیل امنیتی را قدمبهقدم سادهتر کنیم. 🚀
شکار موفق!
https://rodtrent.substack.com/p/irql-incident-response-query-language