CodeQL 2.26.0 ya GitHub inaongeza swali (query) la ndani linalotambua mifumo ya prompt-injection ya AI, na mabadiliko hayo tayari yanasababisha mifumo ya CI kuashiria hatari mpya. Kuongeza toleo pekee haitoshi—timu zinahitaji seti ya majaribio ya regression (regression test suite) inayohakikisha kuwa sheria hiyo inabaki kuwa thabiti wakati kodi inapoendelea kubadilika.
Kwa nini fixture ya regression ni muhimu
Prompt injection inamruhusu mshambuliaji kuingiza maelekezo hasi kwenye prompt ambayo baadaye mfumo wa lugha (language model) utayafuata. Kwa kutumia swali jipya, uchambuzi wa hali tuli (static analysis) unaweza kufuatilia data kutoka kwenye chanzo kisichotaminika hadi kwenye sink ya kuitia wito wa modeli (model-calling sink). Ikiwa sheria hiyo itawashwa tu na isithibitishwe kamwe, marekebisho ya baadaye (refactor) yanaweza kuvuruga njia ya mtiririko wa data (data-flow path) na tahadhari hiyo itapotea kimyakimya. Fixture ya regression inakamata njia kamili ambazo zinapaswa kuashiria (au kutokuashiria) sheria hiyo, ikigeuza matokeo ya uchambuzi wa hali tuli kuwa mkataba ambao ujenzi (build) unauhimiliza.
Viungo vitatu vya fixture inayofaa
- Chanzo kisichotaminika (Untrusted source) – kazi (function) yoyote inayoleta data kutoka nje ya msingi wa kodi unaotaminika (mfano, mwili wa GitHub issue, payload ya webhook).
- Uundaji wa prompt (Prompt construction) – kodi inayokusanya ombi la modeli, kwa kawaida ni wito kwa client SDK.
- Model sink – njia (method) ya SDK inayotuma prompt kwenye modeli. Injini ya mtiririko wa data ya CodeQL inahitaji kuona wito halisi kutoka kwenye mfumo wako wa uzalishaji (production stack) ili kutambua sink hiyo.
Swali hutoa tahadhari tu wakati vitu vyote vitatu vipo.
Kupanga faili za majaribio
Mpangilio wa kawaida unaweka seti hiyo kuwa rahisi kukaguliwa:
security-fixtures/prompt-injection/
├─ positive/
│ ├─ direct-flow.ts
│ └─ helper-flow.ts
├─ negative/
│ └─ trusted-instruction.ts
└─ expected-alerts.json
Faili za positive zina kodi ambazo zinapaswa kuashiriwa; faili za negative zina mifumo salama ambayo lazima ibaki kimya.
Kuandika kesi chanya (positive cases)
Mfano rahisi zaidi unaonyesha mtiririko wa moja kwa moja kutoka kwenye thamani isiyotaminika hadi kwenye wito wa modeli:
import { model } from "./supported-client";
declare function loadIssueBody(id: number): Promise<string>;
export async function summarize(id: number) {
const untrusted = await loadIssueBody(id);
return model.generate({
system: "Summarize the issue",
user: untrusted,
});
}
Hapa loadIssueBody ndicho chanzo kisichotaminika, model.generate ndiyo sink, na data inapita bila hatua yoyote ya kusafisha (sanitisation)—kile hasa ambacho swali limeundwa kukikamata.
Kesi ya pili chanya inapaswa kupitisha data kupitia kazi msaidizi (helper function), ikithibitisha kuwa uchambuzi unafuata njia zisizo za moja kwa moja:
function wrapUserInput(input: string) {
return { system: "Summarize the issue", user: input };
}
export async function summarizeViaHelper(id: number) {
const raw = await loadIssueBody(id);
return model.generate(wrapUserInput(raw));
}
Faili zote mbili zinapaswa kuwa chini ya positive/.
Kuandika kesi hasi (negative case)
Fixture ya hasi lazima ionyeshe kuwa ingizo la mtumiaji haliwezi kubadilisha maelekezo ya modeli. Kosa la kawaida ni kudhania kuwa kazi inayoitwa sanitize() inahakikisha usalama. Mchambuzi wa hali tuli hautuchukulii jina hilo kama uthibitisho, hivyo jaribio linapaswa kuepuka kizuizi (stub) chochote cha kusafisha kinachoweza kupotosha:
export async function safeSummarize(id: number) {
const trusted = "Summarize the issue";
const user = await loadIssueBody(id); // not used in the system prompt
return model.generate({
system: trusted,
user: "Static placeholder",
});
}
Kwa sababu data isiyotaminika haifiki kamwe kwenye uwanja wa system, sheria hiyo inapaswa kubaki kimya.
Kutangaza matarajio katika JSON
Mkataba wa seti hiyo upo kwenye expected-alerts.json. Unaorodhesha tahadhari zinazohitajika na njia ambazo zimekatazwa waziwazi:
{
"required": [
{
"ruleId": "USE_ACTUAL_RULE_ID",
"pathSuffix": "positive/direct-flow.ts"
},
{
"ruleId": "USE_ACTUAL_RULE_ID",
"pathSuffix": "positive/helper-flow.ts"
}
],
"forbiddenPathSuffixes": [
"negative/trusted-instruction.ts"
]
}
Badilisha USE_ACTUAL_RULE_ID na utambulisho unaoonyeshwa kwenye hati ya CodeQL au matokeo ya SARIF. Usikisie ID; mfululizo sahihi wa herufi (string) ni muhimu kwa ukaguzi wa CI.
Kuunganisha fixture kwenye CI
- Weka (pin) toleo la CodeQL CLI linalotumiwa kwenye pipeline kuwa 2.26.0 (au zaidi).
- Jenga kanzi data (database) inayoweza kutupwa kutoka kwenye checkout ya sasa kabla ya kuendesha fixture.
- Endesha swali, kamata tahadhari, na uzilinganishe na
expected-alerts.json. - Feli ujenzi (build) ikiwa tahadhari yoyote inayohitajika itapotea au ikiwa njia iliyokatazwa itaanza kutoa tahadhari.
Usidai jumla ya idadi ya tahadhari kwenye repositorio nzima—mabadiliko yasiyohusiana yanaweza kuongeza idadi hiyo na kusababisha kufeli kwa uongo.
Nini cha kuangalia baada ya kuongeza toleo (upgrade)
Unapoongeza CodeQL hadi toleo jipya:
- Tahadhari inayohitajika bado inaonekana – endelea na ukaguzi wa kawaida.
- Tahadhari inayohitajika imepotea – zuia ujenzi; chunguza ikiwa toleo jipya limebadilisha mantiki ya swali au ikiwa mabadiliko ya kodi yamevuruga mtiririko wa data.
- Mahali papya chanya (positive location) panatokea – liongeze kwenye orodha ya
requiredbaada ya kuthibitisha kuwa ni njia halisi ya injection. - Udhibiti hasi (negative control) unaanza kutoa tahadhari – pitia tena mkakati wa upunguzaji hatari; sheria inaweza kuwa imekuwa kali zaidi.
Uchambuzi wa hali tuli hauwezi kuthibitisha jinsi modeli itakavyofanya kazi wakati wa utendaji (runtime). Kamilisha seti ya regression kwa majaribio ya uadui (adversarial tests) ambayo yanatuma prompt zilizoundwa maalum kwenye modeli na kuthibitisha jibu.
Hitimisho
CodeQL 2.26.0 inakupa uwezo wa kukamata hitilafu za prompt-injection kabla hazijatolewa, lakini ni ikiwa tu utafunga uwezo huo kwa kutumia fixture ya regression iliyolenga. Kwa kufafanua vyanzo visivyotaminika, sink halisi za SDK, na matarajio ya wazi katika mkataba wa JSON, unageuza sheria ya uchambuzi wa hali tuli kuwa lango linalozuia regression na kulazimisha uangalizi wa mara kwa mara kwenye eneo la mashambulizi linalobadilika kwa kasi.
