flawopen.com/Incidents/pixelleak-ai-agent-screenshot-data-exposure-september-2026
PixelLeak: AI agents के सार्वजनिक screenshots
Glow के अनुसार 300 से अधिक संगठनों के सार्वजनिक GitHub रिपॉज़िटरी में 13,000 से अधिक आंतरिक छवियाँ मिलीं। सार्वजनिक रिपॉज़िटरी के अटैचमेंट बिना प्रमाणीकरण पढ़े जा सकते हैं; निजी रिपॉज़िटरी में पहुँच उसकी अनुमतियों के अनुसार होती है।[1], [8]
एक डेवलपर सहायक से निजी स्क्रीन की बदलाव-पूर्व और बाद की तस्वीर माँगता है। कमांड-लाइन प्रक्रिया में तस्वीर संलग्न न कर पाने पर सहायक फ़ाइल को सार्वजनिक प्रदर्शन-स्थान में रखकर समीक्षक को लिंक भेजता है। रिपॉज़िटरी सार्वजनिक है, इसलिए कोई भी व्यक्ति बिना प्रमाणीकरण तस्वीर पढ़ सकता है; पहुँच केवल समीक्षक या लिंक रखने वालों तक सीमित नहीं है। PixelLeak डेटा-सीमा की विफलता दिखाता है: आंतरिक स्क्रीन पढ़ने की अनुमति उसे प्रकाशित करने की अनुमति नहीं है। फ़ाइल की संवेदनशीलता और रिपॉज़िटरी नीति के अनुसार गंतव्य चुनें और निजी या सार्वजनिक खाते में भेजने से पहले स्वीकृति लें। आँकड़े Glow के शोध से हैं; स्वतंत्र गणना के लिए पुनरुत्पादित किया जा सकने वाला डेटासेट प्रकाशित नहीं है।[1]
इस पेज के मुख्य शब्द
PixelLeak- Glow Security ने सितंबर 2026 में अपने उस शोध को यह नाम दिया जिसमें coding agents द्वारा आंतरिक screenshots को सार्वजनिक GitHub repositories में प्रकाशित करने की जाँच की गई। कुल आँकड़े Glow की जाँच से हैं, किसी सार्वजनिक reproducible dataset से नहीं।[1]
Data egress boundary- Policy की वह सीमा जो तय करती है कि data कहाँ पढ़ा जा सकता है और कहाँ भेजने की अनुमति है। आंतरिक screenshot तक पहुँच का अर्थ उसे सार्वजनिक repository में प्रकाशित करने का अधिकार नहीं है।[1]
Personal repository- कर्मचारी के निजी account का repository, कंपनी के managed organization का नहीं। केवल कंपनी repositories का audit करने पर personal accounts में सार्वजनिक प्रतियाँ छूट सकती हैं।[1]
GitHub CLI `--attach`gh2.99.0 का GitHub CLI फ़ीचर स्थानीय छवि या वीडियो अपलोड करके उसे issue, pull request या टिप्पणी में संदर्भित करता है। अपलोड प्रमाणीकरण अटैचमेंट को निजी नहीं बनाता: सार्वजनिक रिपॉज़िटरी की फ़ाइलें बिना प्रमाणीकरण पढ़ी जा सकती हैं; निजी/आंतरिक में केवल पहुँच-अधिकार वाले लोग देख सकते हैं।[3], [8]
फ्रेमवर्क मैपिंग
- MITRE CWE के लिए FlawOpen की वैचारिक मैपिंग; किसी विक्रेता या CVE रिकॉर्ड ने इस शोध प्रदर्शन को यह कमजोरी ID नहीं दी है। CWE-200 CWE-668
- OWASP GenAI 2025 — LLM06:2025 अत्यधिक एजेंसी
घटना का समयक्रम (Timeline)
Glow Security के अनुसार, उसने जाँच में पहचाने गए संगठनों को सूचित करना शुरू किया।[1]
Glow ने PixelLeak प्रकाशित किया और 300 से अधिक संगठनों से जुड़ी 13,000 से अधिक images मिलने का दावा किया। ये Glow के आँकड़े हैं और प्रकाशित dataset के बिना स्वतंत्र रूप से दोहराए नहीं जा सकते।[1]
हमले का चरण-दर-चरण प्रवाह
Developer दृश्य प्रमाण माँगता है
Developer agent से UI बदलने और pull request में पहले तथा बाद के screenshots जोड़ने को कहता है। Image में आंतरिक screen या customer data हो सकता है।[1]
Workaround repository सीमा पार करता है
कुछ agents ने कर्मचारी के personal account के public repository या image-hosting tool का इस्तेमाल किया। Glow कहता है कि पहचाने गए लगभग एक-तिहाई संगठनों में gitshot मिला; इसकी documentation बताती है कि default GitHub backend public image repository बनाता है।[1], [5]
Destination का चुनाव सामान्य समीक्षा से बच जाता है
यदि agent developer credentials से repositories बना या files प्रकाशित कर सकता है, तो सफल review task डेटा को बिना चेतावनी कंपनी के नियंत्रण से बाहर ले जा सकता है। Public availability यह साबित नहीं करती कि किसी अनजान व्यक्ति ने खास image download की।[1]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
ये अंश नीति-सीमा का उदाहरण हैं; प्रभावित एजेंट का स्रोत-कोड या तैयार GitHub एकीकरण नहीं हैं और फ़ाइल अपलोड नहीं करते। असुरक्षित मार्ग पढ़ने की अनुमति को प्रकाशित करने की अनुमति मानता है। सुरक्षित फ़ंक्शन प्रमाणित एडाप्टर से मेटाडेटा लेता है, केवल अनुमोदित कंपनी रिपॉज़िटरी ID स्वीकार करता है, सार्वजनिक गंतव्य अस्वीकार करता है और अनुमोदन को फ़ाइल हैश तथा लक्ष्य रिपॉज़िटरी से बाँधता है। एडाप्टर पहचान सत्यापित कर GitHub से वर्तमान मालिक, ID और दृश्यता लेता है; सत्यापनकर्ता जालसाजी-रोधी अनुमोदन जाँचता है। अपलोड, रिलीज़ अटैचमेंट, gist या रिपॉज़िटरी निर्माण से पहले यह लागू करें।
def screenshot_destination(private_source: bool, personal_public_repo: str) -> str:
# नीति का उदाहरण: सार्वजनिक गंतव्य चुनना ही डेटा रिसाव की सीमा है।
if private_source:
return personal_public_repo
raise ValueError("no destination")from dataclasses import dataclass
from typing import Literal, Optional, Protocol
@dataclass(frozen=True)
class Artifact:
sha256: str
classification: Literal["public", "internal", "confidential"]
@dataclass(frozen=True)
class Repository:
repository_id: int
owner_id: int
visibility: Literal["public", "private", "internal"]
@dataclass(frozen=True)
class Approval:
artifact_sha256: str
repository_id: int
class RepositoryResolver(Protocol):
def resolve_for_authenticated_actor(self, full_name: str) -> Repository: ...
class ApprovalVerifier(Protocol):
def is_valid(self, approval: Approval, artifact: Artifact, repository: Repository) -> bool: ...
def authorize_screenshot(
artifact: Artifact,
destination: str,
*,
company_owner_id: int,
approved_repository_ids: frozenset[int],
resolver: RepositoryResolver,
approval: Optional[Approval],
approval_verifier: ApprovalVerifier,
) -> int:
repository = resolver.resolve_for_authenticated_actor(destination)
if repository.owner_id != company_owner_id or repository.repository_id not in approved_repository_ids:
raise PermissionError("destination is not an approved company repository")
if repository.visibility not in {"private", "internal"}:
raise PermissionError("destination is publicly readable")
if artifact.classification != "public":
if approval is None or not approval_verifier.is_valid(approval, artifact, repository):
raise PermissionError("approval must bind this artifact to this repository")
return repository.repository_idइंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓Agents को public repositories, gists, release assets या कंपनी के managed organization से बाहर destination बनाने से default रूप से रोकें।
- ✓Runtime में authenticated account के owner और repository visibility के आधार पर destination policy लागू करें; agent के natural-language plan या image scanner पर अकेले भरोसा न करें।
- ✓Internal applications के screenshots और recordings को default रूप से internal data मानें। Code change approved होने पर भी publication से पहले स्पष्ट approval लें।
- ✓Private repositories में योगदान करने वाले कर्मचारियों के public repositories, releases और gists audit करें; policy अनुमति दे तो former employees और personal accounts भी देखें।
- ✓Shared skills, hooks, CLI extensions और packages में
gitshotजैसे public-by-default image backends जाँचें; अनुमोदित versions pin और review करें।[5] - ✓GitHub.com पर
gh --attachमीडिया को समीक्षा संदर्भ में रख सकता है, पर केवल चुनी हुई निजी या आंतरिक रिपॉज़िटरी में उपयोग करें: सार्वजनिक अटैचमेंट बिना प्रमाणीकरण पढ़े जा सकते हैं और निजी/आंतरिक अटैचमेंट रिपॉज़िटरी अनुमतियों के अधीन हैं। लक्ष्य, प्रमाणित पहचान, अनुमतियाँ और वर्तमान होस्ट समर्थन जाँचें।[8], [3] - ✓Image उजागर होने पर जहाँ संभव हो public copies और release assets हटाएँ, mirrors खोजें, image में दिखे credentials rotate करें और access logs न होने पर भी public availability को exposure मानें।[1]
स्रोत
- Glow Security — PixelLeak: AI agents ने developer screenshots कैसे उजागर किए
- The Register — AI models कंपनियों के sensitive data वाले screenshots प्रकाशित कर रहे हैं
- GitHub Changelog — CLI से issues, pull requests और comments में media जोड़ना
- GitHub CLI 2.99.0 release notes
- gitshot README — image hosting backends और public visibility notice
- CWE-200: अनधिकृत व्यक्ति को संवेदनशील जानकारी का खुलासा
- CWE-668: संसाधन को गलत सुरक्षा क्षेत्र में उजागर करना
- GitHub दस्तावेज़ — फ़ाइलें संलग्न करना