Skip to content

feat(analyze-problem): stahování příloh/screenshotů s povinnou bezpečnostní kontrolou před analýzou #725

Description

@pekral

Cíl

Rozšířit skill analyze-problem (a sdílené tracker gatherery) tak, aby uměl
spolehlivě stáhnout všechny přílohy a screenshoty k analyzovanému issue (JIRA,
GitHub, Bugsnag) a předat je analýze. Stažení musí proběhnout až poté, co nad
každým souborem proběhne povinná bezpečnostní kontrola — agent nesmí otevřít,
renderovat ani „přečíst" přílohu, která je bezpečnostní riziko (spustitelný obsah,
polyglot, HTML/SVG s aktivním obsahem, mime mismatch, archivní bomba).

Motivace: dnes gatherer přílohy jen vylistuje (název, mime, velikost, contentUrl)
a agent je fakticky nestáhneacli stahování neumí a agent nemá doloženou
auth cestu k binárnímu obsahu. Analýza tak běží naslepo bez screenshotů.

Současný stav

  • skills/analyze-problem/SKILL.md v sekci Issue-tracker context (mandatory pre-flight)
    říká: „Read the inventoried attachments … with your own tools" — ale žádný nástroj
    ani auth mechanismus pro stažení binárního obsahu neexistuje.
  • skills/code-review-jira/scripts/gather-issue-context.sh přílohy pouze inventarizuje
    (### Přílohy, řádky ~94–99) a na řádku 211 explicitně píše:
    „Obsah příloh není v tomto dokumentu — acli přílohy nestahuje. Načti je sám přes
    contentUrl (autentizovaně) vlastními nástroji."
  • skills/code-review-jira/scripts/load-issue.sh má v JSON kontraktu
    attachments[] = { id, name, size, mimeType, contentUrl, ... } (řádky ~341–346) —
    data tedy máme, chybí jen download + security gate.
  • Auth profil acli je OAuth (token v keychainu) — pro download nepoužitelný bez
    scrapování keychainu (nepřijatelné). Reálně ověřeno: bez API tokenu nelze přílohu stáhnout.
  • Žádný bezpečnostní krok nad přílohami neexistuje.

Cílový stav

  1. Nový download skript per tracker (sdílí společný helper):

    • skills/code-review-jira/scripts/download-attachments.sh <KEY|URL> [--dest DIR]
    • skills/code-review-github/scripts/download-attachments.sh <NUMBER|URL> [--dest DIR]
    • skills/code-review-bugsnag/scripts/download-attachments.sh <URL|TRIPLE> [--dest DIR]
    • společná logika v skills/_shared/attachments.sh (nebo per-skill _lib.sh jako u bugsnag).

    Skript načte inventář příloh (z gathereru / load-issue.sh), pro každou stáhne obsah
    do karanténního adresáře (<dest>/_quarantine/, default pod scratchpadem),
    s TLS validací ON, autentizovaně, a vypíše manifest (attachments-manifest.json)
    s id, name, declaredMime, size, sha256, localPath, status.

    • JIRA auth: Basic auth email:token z dokumentovaného zdroje v tomto pořadí:
      --token-file, pak env JIRA_API_TOKEN, pak ~/.config/acli/jira_api_token (chmod 600).
      Endpoint https://<site>/rest/api/3/attachment/content/<id>. Token se nikdy
      neobjeví v argv ani v logu.
    • GitHub: přes gh api / autentizovaný curl s gh auth token.
    • Bugsnag: přes dokumentovaný API token (env), TLS on.
  2. Povinná bezpečnostní brána PŘED analýzouskills/_shared/scan-attachments.sh
    (volaná download skriptem nebo SKILL.md hned po stažení), která nad každým souborem
    v karanténě provede deterministické kontroly a teprve bezpečné soubory promuje do
    <dest>/safe/:

    • detekce typu z magic bytes (file), porovnání s declaredMime → mismatch = blok;
    • allowlist typů určených k analýze: png, jpg/jpeg, gif, webp, pdf, txt, log, csv, json;
    • blok: spustitelné (ELF/Mach-O/PE), skripty, archivy (zip/gz/tar) bez explicitního opt-inu,
      HTML, SVG s aktivním obsahem (<script>, on*, <foreignObject>), polyglot
      (soubor validní jako obrázek i jako HTML/JS), Office s makry;
    • limity: max velikost na soubor (např. 25 MB) a max počet (např. 25);
    • každému souboru přiřadí verdikt pass | block + důvod do manifestu.
    • U čehokoli podezřelého / nejednoznačného předá nález existujícímu security skillu
      (security-review, příp. security-threat-analysis) a teprve jeho verdikt rozhodne.
      Critical → soubor se neanalyzuje, jen se reportuje.
  3. SKILL.md analyze-problem — aktualizace pre-flightu: po inventarizaci příloh
    gathererem agent musí spustit download-attachments.shscan-attachments.sh
    (security gate) → a číst/renderovat pouze soubory z safe/. Doplnit dokumentaci
    auth setupu (token soubor / env) a chování při zablokované příloze (uvést do
    Assumptions / Sources, nikdy ji neotvírat).

Acceptance Criteria

  • Existuje download-attachments.sh pro všechny tři trackery + sdílený helper; každý
    stáhne všechny přílohy daného issue do karantény a vypíše attachments-manifest.json.
  • JIRA download funguje přes Basic auth z --token-file / JIRA_API_TOKEN /
    ~/.config/acli/jira_api_token; bez tokenu skončí čistou chybou s návodem
    (exit code ≠ 0), nikdy ne tichým selháním.
  • TLS validace je vždy zapnutá (žádné -k / --insecure / verify=false).
  • Token se nikdy neobjeví v argv, ve výpisu ani v manifestu.
  • scan-attachments.sh zablokuje (nepromuje do safe/): spustitelné, polyglot,
    HTML, SVG s aktivním obsahem, mime mismatch, soubor nad limit velikosti, typ mimo allowlist.
  • Bezpečné obrázky (PNG/JPEG) a PDF projdou do safe/ a jsou dostupné analýze.
  • Podezřelé soubory jsou předány security skillu; Critical verdikt = blok + report,
    žádné otevření.
  • SKILL.md skillu analyze-problem popisuje povinné pořadí
    inventář → download → security gate → analýza pouze nad safe/ a auth setup.
  • Skripty mají korektní exit kódy a set -euo pipefail; README/usage v hlavičce skriptu.
  • Testovací scénář (fixture) doloží, že škodlivá SVG/HTML/polyglot příloha je zablokována
    a benigní PNG projde.

Co NEMĚNIT / bezpečnostní mantinely (z rules/security/*)

  • Nikdy curl … | sh, žádné stažení napojené přímo na interpret.
  • Nikdy nevypínat TLS (-k, --insecure, --no-check-certificate, verify=false).
  • Neotvírat přílohu před proběhnutím security gate; blokovaný soubor se jen reportuje.
  • Karanténní soubory psát s 0600, do dedikovaného adresáře (scratchpad), ne do repa.
  • Neměnit kontrakt attachments[] v load-issue.sh — jen ho číst.
  • Nezavádět nové runtime závislosti bez dohody (vystačit s curl, jq, file, gh, acli).

Tipy a inspirace

  • Inventář příloh: skills/code-review-jira/scripts/gather-issue-context.sh:94,
    poznámka :211; JSON kontrakt skills/code-review-jira/scripts/load-issue.sh:341.
  • Pattern sdíleného helperu: skills/code-review-bugsnag/scripts/_lib.sh.
  • Bezpečnostní pravidla pro obsah příloh: rules/security/backend.md a frontend.md,
    sekce Malicious File Upload Content (SVG/HTML/polyglot/nosniff) a
    Malicious Code & Supply-Chain Indicators (tichý curl, TLS, potlačení chyb).
  • Security skilly k zapojení: security-review, security-threat-analysis.
  • JIRA attachment endpoint: GET /rest/api/3/attachment/content/{id} (Basic auth email:token).

Out of scope

  • Sanitizace a oprava nebezpečných příloh (jen blok + report, ne čištění SVG).
  • OCR / extrakce textu z obrázků.
  • Centrální správa/rotace API tokenů.
  • Změny v logice analýzy samotné (framework 10 kroků zůstává).
  • Cachování stažených příloh mezi běhy.

Definition of Done

  1. PR proti master v pekral/cursor-rules, CI green.
  2. Nové skripty + úprava SKILL.md dle AC, fixture test prokazuje blok škodlivé / průchod benigní přílohy.
  3. PR popis odkazuje na tento issue.
  4. Code review schválena.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions