flawopen.com/संदर्भ/PR बॉट सुरक्षा
AI PR रिव्यू बॉट: Prompt Injection से SSRF रोकें
अविश्वसनीय pull request पाठ AI टूल को कैसे प्रभावित कर सकता है और बॉट की अनुमतियाँ व नेटवर्क पहुँच कैसे सीमित करें।
सरल उदाहरण: निजी नेटवर्क का पास रखने वाला समीक्षक
Pull Request समीक्षा टीम को दिए गए पैकेट जैसी है: सामग्री उपयोगी हो सकती है, पर वह कंपनी की नीति नहीं बन जाती। यदि AI समीक्षक निजी नेटवर्क से कोई भी URL प्राप्त कर सकता है, तो भ्रामक निर्देश उसके लक्ष्य को प्रभावित कर सकता है। जोखिम टूल और नेटवर्क अनुमतियों पर निर्भर है; शत्रुतापूर्ण पाठ पढ़ने भर से नेटवर्क पहुँच नहीं मिलती।
मुख्य अवधारणाएँ और शब्द
- अविश्वसनीय इनपुट:
- योगदानकर्ताओं के Pull Request शीर्षक, विवरण, टिप्पणियाँ, diff और लिंक की सामग्री।
- अप्रत्यक्ष Prompt Injection:
- मॉडल संदर्भ में शामिल होने के कारण अविश्वसनीय पाठ एजेंट को प्रभावित करता है।
- SSRF सीमा:
- सर्वर-साइड फ़ेच टूल ऐसे गंतव्य तक पहुँच सकता है जहाँ योगदानकर्ता सीधे नहीं पहुँच सकता।
- प्रभाव की शर्तें:
- साथ में सुलभ आंतरिक सेवा, उपलब्ध क्रेडेंशियल और कमजोर अनुमति या egress नियंत्रण भी आवश्यक हैं।
तंत्र और मूल कारण
रिव्यू बॉट योगदानकर्ता-नियंत्रित पाठ और भरोसेमंद समीक्षा निर्देश मॉडल को दे सकता है। मॉडल किसी भी स्रोत के आधार पर टूल कॉल सुझा सकता है। Prompt और delimiters नेटवर्क पहुँच की अनुमति नहीं देते। SSRF तभी संभव है जब एप्लिकेशन मॉडल द्वारा चुने गंतव्य को स्वीकार करे और नेटवर्क-सक्षम टूल वहाँ पहुँच सके। क्लाउड मेटाडेटा या क्रेडेंशियल तक पहुँच अतिरिक्त सशर्त प्रभाव है, Prompt Injection का अपने-आप होने वाला परिणाम नहीं।
सशर्त हमला पथ
योगदानकर्ता PR सामग्री नियंत्रित करता है
बाहरी योगदानकर्ता शीर्षक, विवरण, टिप्पणियाँ, बदला हुआ पाठ और लिंक की सामग्री प्रभावित कर सकता है।
एजेंट सामग्री पढ़ता है
सेवा कुछ अविश्वसनीय फ़ील्ड मॉडल संदर्भ में रखती है; इससे जवाब या टूल सुझाव प्रभावित हो सकते हैं।
टूल पहुँच तय करता है
यदि एजेंट कोई भी URL प्राप्त कर सके, तो runner नेटवर्क द्वारा अनुमत गंतव्य से संपर्क कर सकता है। ऐसा टूल न हो तो यह SSRF पथ नहीं है।
प्रभाव तैनाती पर निर्भर है
आंतरिक डेटा या क्रेडेंशियल तभी उजागर होंगे जब सुलभ सेवाएँ, मेटाडेटा सेटिंग, पहचान-अधिकार और आउटपुट नियंत्रण इसकी अनुमति दें।
कोड: बिना जाँच dispatch बनाम अधिकृत read-only सुविधा
# INERT DEMO: model-selected URL reaches a mock tool without policy checks
from dataclasses import dataclass
@dataclass
class ToolCall:
name: str
arguments: dict[str, str]
class MockFetch:
def __init__(self):
self.calls = []
def __call__(self, url: str) -> str:
self.calls.append(url)
return "fixture response"
def dispatch_unchecked(call: ToolCall, tools: dict):
# The mock records a string; it makes no network request.
return tools[call.name](**call.arguments)
mock_fetch = MockFetch()
call = ToolCall("fetch_url", {"url": "https://docs.example.invalid/"})
assert dispatch_unchecked(call, {"fetch_url": mock_fetch}) == "fixture response"
assert mock_fetch.calls == ["https://docs.example.invalid/"]
# SAFE DEMO: the agent receives only a read-only PR capability
from dataclasses import dataclass
@dataclass(frozen=True)
class ReviewContext:
repository: str
pull_request: int
@dataclass
class ToolCall:
name: str
arguments: dict[str, object]
READ_ONLY_TOOLS = {"read_pr_diff"}
def dispatch_review_call(call: ToolCall, context: ReviewContext, policy, tools):
if call.name not in READ_ONLY_TOOLS:
raise PermissionError("Tool is not available to this review")
expected = {"repository": context.repository,
"pull_request": context.pull_request}
if call.arguments != expected:
raise ValueError("Arguments must match the authorized review")
if not policy.can_read_pr(context.repository, context.pull_request):
raise PermissionError("Review principal cannot read this pull request")
# The injected read_pr_diff function is trusted app code, not model output.
return tools["read_pr_diff"](**expected)
इंजीनियरिंग सख्तीकरण चेकलिस्ट
- इस उदाहरण को PR बॉट की पुष्टि की गई घटना न बताएं। यह एक सशर्त डिज़ाइन जोखिम का मॉडल है।
- केवल diff देखने वाले समीक्षक को मनमाने URL फ़ेच करने वाला टूल न दें।
- यदि बाहरी लिंक preview ज़रूरी हो, तो समर्पित egress सेवा उपयोग करें जिसमें destination allowlist, कनेक्शन के समय DNS/IP जाँच, redirects की पुनः जाँच, सख्त समय और आकार सीमा तथा कोई छिपे credentials न हों।
- नेटवर्क स्तर पर runner को निजी नेटवर्क और क्लाउड metadata से रोकें। ज़रूरत न हो तो metadata बंद करें; अन्यथा IMDSv2 आवश्यक करें और container hop limit की जाँच करें।
- बॉट को repository तक सीमित read-only पहचान दें। अविश्वसनीय PR jobs को secrets न दें और privileged workflows को बाहरी code execution से अलग रखें।
- GitHub Actions में अविश्वसनीय code के लिए न्यूनतम अधिकार वाला `pull_request` चुनें। `pull_request_target` को privileged मानें; उसके secrets या write token के साथ fork code कभी न चलाएँ।
- अस्वीकृत tool calls और destination policy फैसले लॉग करें; tokens, पूरे private diff या संवेदनशील response body न रखें।