Ë
    ÛJêj   ã                  óÄ   — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlZ ee«      j                  «       j                  d   dz  dz  Zdd„Zdd	„Zdd
„Zdd„Zdd„Zy)uÉ  DeterministickÃ© kontroly injektÃ¡Å¾e pÅ™es procesy v `src/`.

ProÄ� tento soubor existuje: 5. 10. 2026 spustil `agent-audit` (arXiv:2603.22853)
a reportoval 4 CRITICAL findings â€žLangChain Tool Input Not Sanitizedâ€œ na
`model_layer/ollama_client.py` a `llama_cpp_client.py`. Ty jsou **faleÅ¡nÃ©
pozitivy** â€” v tÄ›chto souborech nenÃ­ ani `@tool`, ani `langchain`:

    grep -nE "@tool|langchain" src/cyberbrain26/model_layer/ollama_client.py
    # (prÃ¡zdnÃ©)

Jeho vlastnÃ­ pravidlo `AGENT-034` pak u 7 mÃ­st s `subprocess.run` tvrdilo
â€žchybÃ­ validace vstupuâ€œ, coÅ¾ je formÃ¡lnÄ› pravda a prakticky bez dopadu â€” vÅ¡echna
volÃ¡nÃ­ jsou list argv s konstantnÃ­mi flagy.

Co z toho plyne: `agent-audit` mÃ¡ jinou hranici neÅ¾ tahle. Jeho nÃ¡lezy jsou
podklad k triage, ne nÃ¡hrada kontroly. Kontrola, kterÃ¡ je tady, je **deterministickÃ¡
a ÃºplnÃ¡**: kontroluje pÅ™esnÄ› tu vlastnost, kterÃ¡ injektÃ¡Å¾i umoÅ¾Åˆuje, mÃ­sto toho,
aby hÃ¡dala jejÃ­ strukturu.
é    )ÚannotationsN)ÚPathé   ÚsrcÚcyberbrain26c                 óª  — t         j                  «       st        j                  t         › d�«       t	        t         j                  d«      «      } | s‚t        j                  t         › d�«      dz   ddt        j                  «       v st        j                  | «      rt        j                  | «      ndiz  }t        t        j                  |«      «      ‚| S )Nun    neexistuje â€” sada by neproÅ¡la ani jednou iteracÃ­ a test by vypadal jako zelenÃ½, aniÅ¾ by cokoli ovÄ›Å™ilz*.pyu1    neobsahuje Å¾Ã¡dnÃ½ '*.py' â€” vakuovÃ¡ kontrolaú
>assert %(py0)sÚpy0Úfiles)ÚSRCÚis_dirÚpytestÚfailÚsortedÚrglobÚ
@pytest_arÚ_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r   Ú@py_format1s     úE/home/oem/CyberBrain26-unified/tests/test_process_injection_guards.pyÚ_python_sourcesr      s�   € Ü�:‰:Œ<Ü�‰Üˆeð =ð =ô	
ô ”3—9‘9˜VÓ$Ó%€EÙ×KÖK”S�EÐJÐK×K×K×K×K×KÔKˆ5×K×KÓKˆ5×K×K×K×K×KØ€Ló    c                ó   — g }| D ]†  }|j                  d¬«      }t        |j                  «       d¬«      D ]T  \  }}|j                  |«      sŒ|j	                  |j                  t        j                  j                  «      › d|› �«       ŒV Œˆ |S )uG   VraÅ¥ `soubor:Å™Ã¡dek` pro kaÅ¾dÃ½ vÃ½skyt. PrÃ¡zdnÃ½ seznam = Ä�istÃ©.zutf-8)Úencodingr   )Ústartú:)Ú	read_textÚ	enumerateÚ
splitlinesÚsearchÚappendÚrelative_tor   Úparent)r   ÚpatternÚhitsÚpathÚtextÚnumberÚlines          r   Ú_linesr/   *   s‹   € à€DØò OˆØ�~‰~ wˆ~Ó/ˆÜ% d§o¡oÓ&7¸qÔAò 	O‰LˆF�DØ�~‰~˜dÕ#Ø—‘˜t×/Ñ/´·
±
×0AÑ0AÓBÐCÀ1ÀVÀHÐMÕNñ	OðOð
 €Kr   c                 ó^  — t        t        «       t        j                  d«      «      } |  }|st	        j
                  d| › d�«      dz   ddt        j                  «       v st	        j                  | «      rt	        j                  | «      ndiz  }t        t	        j                  |«      «      ‚d}y)uó  `subprocess` nesmÃ­ nikde pouÅ¾Ã­vat `shell=True`.

    `shell=True` je jedinÃ©, co z promÄ›nnÃ© udÄ›lÃ¡ pÅ™Ã­kaz: bez nÄ›j je kaÅ¾dÃ½ prvek
    listu pÅ™edanÃ½ jako jeden argv element a metacharaktery v hodnotÄ› nejsou
    interpretovÃ¡ny. To je vlastnost, kterÃ¡ injektÃ¡zi pÅ™es proces umoÅ¾Åˆuje, a
    proto se kontroluje pÅ™Ã­mo mÃ­sto odhadovÃ¡nÃ­ tvaru volÃ¡nÃ­.

    V repozitÃ¡Å™i je 14 call-siteÅ¯ `subprocess` a vÅ¡echny jsou list argv. Tento
    test existuje, aby to zÅ¯stalo tak.
    z\bshell\s*=\s*TrueuW   subprocess s shell=True â€” argumenty se interpretujÃ­ jako pÅ™Ã­kaz, ne jako hodnoty: uV   . PouÅ¾ij list argv, viz execution_plane/bubblewrap_provider.py pro referenÄ�nÃ­ tvar.ú
>assert not %(py0)sr
   r*   N©r/   r   ÚreÚcompiler   r   r   r   r   r   r   r   ©r*   Ú@py_assert1Ú@py_format2s      r   Útest_no_shell_true_anywherer8   5   s™   € ô ”/Ó#¤R§Z¡ZÐ0EÓ%FÓG€DØˆ8ð ‰8ô ïé ð	Ø ˜6ð "Hð	H÷õ ïé ÷	ò ïé ð	 ÷ ñ ïé ð	 ÷ ÷ ó ïé ÷	ô r   c                 ó\  — t        t        «       t        j                  d«      «      } |  }|s~t	        j
                  d| › �«      dz   ddt        j                  «       v st	        j                  | «      rt	        j                  | «      ndiz  }t        t	        j                  |«      «      ‚d}y)uÞ   `os.system`, `eval` a `exec` jsou v `src/` zakÃ¡zanÃ©.

    VÅ¡echny tÅ™i vykonajÃ­ Å™etÄ›zec kÃ³dem. `eval`/`exec` navÃ­c nejsou v tomto
    kÃ³du potÅ™eba â€” deklarativnÃ­ JSON/YAML se naÄ�Ã­tÃ¡ pÅ™es `json.loads`.
    z \bos\.system\(|\beval\(|\bexec\(u)   dynamickÃ© vykonÃ¡vÃ¡nÃ­ kÃ³du nalezeno: r1   r
   r*   Nr2   r5   s      r   Ú"test_no_dynamic_process_evaluationr:   H   sn   € ô ÜÓÜ
�
‰
Ð6Ó7ó€Dð ˆ8ÐG‰8×GÖGÐ@ÀÀÐG×G×G×G×G×GÔGˆt×G×GÓGˆt×G×G×G×G×GÒGr   c                 óL  — t        t        «       t        j                  d«      «      } | s{t	        j
                  d«      dz   ddt        j                  «       v st	        j                  | «      rt	        j                  | «      ndiz  }t        t	        j                  |«      «      ‚y)u�  Kontrola vÃ½Å¡e nesmÃ­ hlÃ­dat nulu.

    Bez tohoto testu by `test_no_shell_true_anywhere` proÅ¡la i v repu, kde by
    neexistoval ani jeden `subprocess` call â€” tedy by hlÃ­dala vlastnost, kterÃ¡
    je triviÃ¡lnÄ› pravdivÃ¡ a proti nÃ­Å¾ je nic chrÃ¡nÄ›no. Je to V2 z
    `.kilo/context/LESSONS_AND_DECISIONS.md`: predikÃ¡t, kterÃ½ zruÅ¡Ã­ tvrzenÃ­,
    takÅ¾e pak vypadÃ¡ jako bÄ›Å¾Ã­cÃ­.
    z\bsubprocess\.uã   v src/ nenÃ­ Å¾Ã¡dnÃ½ subprocess call-site â€” test_no_shell_true_anywhere by pak hlÃ­dala triviÃ¡lnÄ› pravdivou vlastnost. BuÄ� je refaktoroval nÄ›kdo, nebo je zdrojovÃ¡ cesta jinÃ¡; obÄ› je tÅ™eba promyslet, ne pÅ™ehlÃ©dnout.r	   r
   r*   Nr2   )r*   r   s     r   Ú=test_subprocess_calls_exist_so_the_guard_above_is_not_vacuousr<   U   s‚   € ô ”/Ó#¤R§Z¡ZÐ0AÓ%BÓC€DÙô ïé ð	]÷õ ïé ÷	ò ïé ð	 ÷ ñ ïé ð	 ÷ ÷ ó ïé ÷	ñ ˆ4r   )Úreturnú
list[Path])r   r>   r)   zre.Pattern[str]r=   z	list[str])r=   ÚNone)Ú__doc__Ú
__future__r   Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   r3   Úpathlibr   r   Ú__file__ÚresolveÚparentsr   r   r/   r8   r:   r<   © r   r   ú<module>rK      s]   ðñõ( #ç  „ ƒ	Ý ã á
ˆ8ƒn×ÑÓ×&Ñ& qÑ)¨EÑ1°NÑB€óóóó&
Hôr   