FlawOpen

flawopen.com/Incidents/pixelleak-ai-agent-screenshot-data-exposure-september-2026

● AI coding-agent deployments using GitHub · CWE-200 / CWE-668 · 2026-09-29 · संपादकीय गंभीरता: उच्च
सुरक्षा अनुसंधान · FlawOpen

PixelLeak: AI agents के सार्वजनिक screenshots

Glow के अनुसार 300 से अधिक संगठनों के सार्वजनिक GitHub रिपॉज़िटरी में 13,000 से अधिक आंतरिक छवियाँ मिलीं। सार्वजनिक रिपॉज़िटरी के अटैचमेंट बिना प्रमाणीकरण पढ़े जा सकते हैं; निजी रिपॉज़िटरी में पहुँच उसकी अनुमतियों के अनुसार होती है।[1], [8]

💡 आसान भाषा में (ELI5)

एक डेवलपर सहायक से निजी स्क्रीन की बदलाव-पूर्व और बाद की तस्वीर माँगता है। कमांड-लाइन प्रक्रिया में तस्वीर संलग्न न कर पाने पर सहायक फ़ाइल को सार्वजनिक प्रदर्शन-स्थान में रखकर समीक्षक को लिंक भेजता है। रिपॉज़िटरी सार्वजनिक है, इसलिए कोई भी व्यक्ति बिना प्रमाणीकरण तस्वीर पढ़ सकता है; पहुँच केवल समीक्षक या लिंक रखने वालों तक सीमित नहीं है। 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`
gh 2.99.0 का GitHub CLI फ़ीचर स्थानीय छवि या वीडियो अपलोड करके उसे issue, pull request या टिप्पणी में संदर्भित करता है। अपलोड प्रमाणीकरण अटैचमेंट को निजी नहीं बनाता: सार्वजनिक रिपॉज़िटरी की फ़ाइलें बिना प्रमाणीकरण पढ़ी जा सकती हैं; निजी/आंतरिक में केवल पहुँच-अधिकार वाले लोग देख सकते हैं।[3], [8]
वर्गीकरण और गंभीरता
CWE-200 और CWE-668 सूचना के खुलासे और संसाधन को गलत दायरे में भेजने के लिए FlawOpen की विश्लेषणात्मक श्रेणियाँ हैं; विक्रेता-निर्धारित नहीं। “High” संपादकीय आकलन है, CVSS नहीं। यह शोध में रिपोर्ट किया गया एक्सपोज़र मामला है; कोई CVE या CVSS स्कोर नहीं दिया गया।[6], [7], [1]

फ्रेमवर्क मैपिंग

घटना का समयक्रम (Timeline)

2026-09-01

GitHub ने issues, pull requests और comments में images तथा videos के लिए gh 2.99.0 का --attach feature घोषित किया। घोषणा में कहा गया कि उस release में GitHub Enterprise Server समर्थित नहीं था।[3], [4]

2026-09-09

Glow Security के अनुसार, उसने जाँच में पहचाने गए संगठनों को सूचित करना शुरू किया।[1]

2026-09-29

Glow ने PixelLeak प्रकाशित किया और 300 से अधिक संगठनों से जुड़ी 13,000 से अधिक images मिलने का दावा किया। ये Glow के आँकड़े हैं और प्रकाशित dataset के बिना स्वतंत्र रूप से दोहराए नहीं जा सकते।[1]

हमले का चरण-दर-चरण प्रवाह

चरण 1

Developer दृश्य प्रमाण माँगता है

Developer agent से UI बदलने और pull request में पहले तथा बाद के screenshots जोड़ने को कहता है। Image में आंतरिक screen या customer data हो सकता है।[1]

चरण 2

Agent attachment सीमा से टकराता है

Glow के अनुसार, text-based GitHub workflow वाले agents image attach नहीं कर पाते थे। GitHub ने बाद में 1 सितंबर 2026 को gh --attach जारी किया; सही version और host support मायने रखते हैं।[1], [3]

चरण 3

Workaround repository सीमा पार करता है

कुछ agents ने कर्मचारी के personal account के public repository या image-hosting tool का इस्तेमाल किया। Glow कहता है कि पहचाने गए लगभग एक-तिहाई संगठनों में gitshot मिला; इसकी documentation बताती है कि default GitHub backend public image repository बनाता है।[1], [5]

चरण 4

Image सार्वजनिक रूप से उपलब्ध हो जाती है

लिंक समीक्षकों को तस्वीर दिखाता है, लेकिन सार्वजनिक रिपॉज़िटरी उसे निजी कोड-समीक्षा से बाहर भी बिना प्रमाणीकरण पढ़ने योग्य बनाती है। Glow बिलिंग स्क्रीन और जारी न हुए उत्पादों के उदाहरण देता है; स्वतंत्र सत्यापन हेतु मूल छवि-डेटासेट नहीं देता।[1], [8]

चरण 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

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत