[{"data":1,"prerenderedAt":1209},["ShallowReactive",2],{"blog-article-claude-code-sandboxing-pl":3},{"id":4,"title":5,"author":6,"body":10,"date":1193,"description":1194,"extension":1195,"image":1196,"locale":1197,"meta":1198,"navigation":1199,"path":1200,"seo":1201,"slug":1202,"stem":1203,"tags":1204,"__hash__":1208},"blog\u002Fblog\u002Fclaude-code-sandboxing.md","Claude Code w piaskownicy: jak skonfigurować sandboxing i dlaczego to naprawdę ma znaczenie",{"name":7,"role":8,"avatar":9},"Przemek Kowalczyk","Senior Full Stack Developer","\u002Fandroid-chrome-512x512.png",{"type":11,"value":12,"toc":1168},"minimark",[13,17,22,25,33,41,44,54,57,84,87,137,151,165,169,198,204,207,211,225,235,351,354,456,475,479,486,741,759,763,769,857,870,874,880,947,964,979,983,1015,1018,1022,1025,1030,1033,1037,1040,1044,1051,1059,1068,1072,1075,1079,1082,1086,1089,1093,1096,1100,1103,1107,1110,1112,1116,1119,1122,1164],[14,15,16],"p",{},"Claude Code potrafi czytać Twój kod, wykonywać polecenia w powłoce, łączyć się z serwerami MCP i pushować zmiany do repozytorium. To właśnie czyni go użytecznym agentem — i to samo czyni go atrakcyjnym celem ataku. Poniżej: jak realnie skonfigurować sandbox w Claude Code oraz seria udokumentowanych, prawdziwych przypadków prompt injection, które pokazują, dlaczego warto to zrobić zanim, a nie po incydencie.",[18,19,21],"h2",{"id":20},"dlaczego-sandbox-a-nie-tylko-zaufanie-do-modelu","Dlaczego sandbox, a nie tylko \"zaufanie do modelu\"",[14,23,24],{},"Domyślnie agent kodujący prosi o zgodę na każdą komendę powłoki. To męczące — i prowadzi do tzw. approval fatigue: użytkownik po którejś z kolei prośbie klika \"zatwierdź\" bez czytania. Sandbox odwraca ten model: zamiast pytać za każdym razem, z góry definiujesz granice (które pliki, które domeny), a system operacyjny egzekwuje je na poziomie procesu — niezależnie od tego, co model \"chciał\" zrobić i czy dana komenda robi więcej, niż sugeruje jej nazwa.",[14,26,27,28,32],{},"To rozróżnienie jest kluczowe: reguły uprawnień (permissions) są oceniane ",[29,30,31],"em",{},"przed"," uruchomieniem komendy na podstawie jej treści; sandbox egzekwuje granicę na uruchomionym już procesie, na poziomie jądra systemu. Innymi słowy — nawet jeśli prompt injection nakłoni Claude Code do wykonania złośliwej komendy, sandbox może i tak zablokować faktyczny dostęp do plików czy sieci.",[18,34,36,37],{"id":35},"szybki-start-sandbox","Szybki start: ",[38,39,40],"code",{},"\u002Fsandbox",[14,42,43],{},"Sandbox działa natywnie na macOS (przez wbudowany framework Seatbelt), Linuksie i WSL2 (przez bubblewrap). Natywny Windows nie jest wspierany — tam trzeba uruchomić Claude Code wewnątrz dystrybucji WSL2.",[45,46,51],"pre",{"className":47,"code":49,"language":50},[48],"language-text","\u002Fsandbox\n","text",[38,52,49],{"__ignoreMap":53},"",[14,55,56],{},"Otwiera to panel z trzema zakładkami:",[58,59,60,68,78],"ul",{},[61,62,63,67],"li",{},[64,65,66],"strong",{},"Mode"," — czy sandboksowane komendy mają być auto-zatwierdzane, czy nadal przechodzić przez zwykłe pytania o zgodę",[61,69,70,73,74,77],{},[64,71,72],{},"Overrides"," — czy komendy, które nie dają się uruchomić w sandboksie, mogą \"spaść\" do trybu bez izolacji (",[38,75,76],{},"allowUnsandboxedCommands",")",[61,79,80,83],{},[64,81,82],{},"Config"," — podgląd wynikowej konfiguracji",[14,85,86],{},"Na Linuksie\u002FWSL2 potrzebne są dwa pakiety:",[45,88,92],{"className":89,"code":90,"language":91,"meta":53,"style":53},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo apt-get install bubblewrap socat   # Ubuntu\u002FDebian\nsudo dnf install bubblewrap socat        # Fedora\n","bash",[38,93,94,120],{"__ignoreMap":53},[95,96,99,103,107,110,113,116],"span",{"class":97,"line":98},"line",1,[95,100,102],{"class":101},"sBMFI","sudo",[95,104,106],{"class":105},"sfazB"," apt-get",[95,108,109],{"class":105}," install",[95,111,112],{"class":105}," bubblewrap",[95,114,115],{"class":105}," socat",[95,117,119],{"class":118},"sHwdD","   # Ubuntu\u002FDebian\n",[95,121,123,125,128,130,132,134],{"class":97,"line":122},2,[95,124,102],{"class":101},[95,126,127],{"class":105}," dnf",[95,129,109],{"class":105},[95,131,112],{"class":105},[95,133,115],{"class":105},[95,135,136],{"class":118},"        # Fedora\n",[14,138,139,142,143,146,147,150],{},[38,140,141],{},"bubblewrap"," egzekwuje izolację systemu plików, ",[38,144,145],{},"socat"," przekierowuje ruch sieciowy przez proxy sandboksa. Opcjonalny filtr seccomp (blokujący gniazda Unix) instaluje się przez ",[38,148,149],{},"npm install -g @anthropic-ai\u002Fsandbox-runtime",".",[14,152,153,154,157,158,161,162,150],{},"Wybór trybu w panelu zapisuje się lokalnie, w ",[38,155,156],{},".claude\u002Fsettings.local.json"," (nie trafia do gita). Żeby włączyć sandbox globalnie dla wszystkich projektów, ustaw ",[38,159,160],{},"sandbox.enabled: true"," w ",[38,163,164],{},"~\u002F.claude\u002Fsettings.json",[18,166,168],{"id":167},"dwa-tryby-pracy","Dwa tryby pracy",[14,170,171,174,175,178,179,182,183,186,187,189,190,193,194,197],{},[64,172,173],{},"Auto-allow"," — komendy próbują uruchomić się w sandboksie i są automatycznie dopuszczane, bez pytania. Jeśli komenda potrzebuje dostępu do domeny spoza listy dozwolonych, wraca do zwykłego procesu zatwierdzania. Nawet w tym trybie zawsze obowiązują: jawne reguły odmowy (",[38,176,177],{},"deny","), potwierdzenie dla ",[38,180,181],{},"rm","\u002F",[38,184,185],{},"rmdir"," celujących w ",[38,188,182],{}," lub katalog domowy, oraz reguły ",[38,191,192],{},"ask"," dotyczące konkretnej treści (np. ",[38,195,196],{},"Bash(git push *)",").",[14,199,200,203],{},[64,201,202],{},"Regular permissions"," — wszystkie komendy Bash przechodzą przez zwykły proces zatwierdzania, nawet jeśli działają w sandboksie. Więcej kontroli, więcej klikania.",[14,205,206],{},"W obu trybach granice systemu plików i sieci są identyczne — różnica dotyczy wyłącznie tego, czy trzeba je ręcznie zatwierdzać.",[18,208,210],{"id":209},"konfiguracja-systemu-plików","Konfiguracja systemu plików",[14,212,213,214,217,218,221,222,197],{},"Domyślnie sandboksowane komendy mogą zapisywać wyłącznie do bieżącego katalogu roboczego i katalogu tymczasowego sesji. Odczyt jest szerszy — obejmuje praktycznie cały dysk, poza wyraźnie zablokowanymi ścieżkami (i uwaga: to domyślnie ",[29,215,216],{},"nie"," blokuje odczytu plików takich jak ",[38,219,220],{},"~\u002F.aws\u002Fcredentials"," czy ",[38,223,224],{},"~\u002F.ssh\u002F",[14,226,227,228,221,231,234],{},"Przykład rozszerzenia dostępu zapisu dla narzędzi typu ",[38,229,230],{},"kubectl",[38,232,233],{},"terraform",":",[45,236,240],{"className":237,"code":238,"language":239,"meta":53,"style":53},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"sandbox\": {\n    \"enabled\": true,\n    \"filesystem\": {\n      \"allowWrite\": [\"~\u002F.kube\", \"\u002Ftmp\u002Fbuild\"]\n    }\n  }\n}\n","json",[38,241,242,248,265,281,295,333,339,345],{"__ignoreMap":53},[95,243,244],{"class":97,"line":98},[95,245,247],{"class":246},"sMK4o","{\n",[95,249,250,253,257,260,262],{"class":97,"line":122},[95,251,252],{"class":246},"  \"",[95,254,256],{"class":255},"spNyl","sandbox",[95,258,259],{"class":246},"\"",[95,261,234],{"class":246},[95,263,264],{"class":246}," {\n",[95,266,268,271,274,276,278],{"class":97,"line":267},3,[95,269,270],{"class":246},"    \"",[95,272,273],{"class":101},"enabled",[95,275,259],{"class":246},[95,277,234],{"class":246},[95,279,280],{"class":246}," true,\n",[95,282,284,286,289,291,293],{"class":97,"line":283},4,[95,285,270],{"class":246},[95,287,288],{"class":101},"filesystem",[95,290,259],{"class":246},[95,292,234],{"class":246},[95,294,264],{"class":246},[95,296,298,301,305,307,309,312,314,317,319,322,325,328,330],{"class":97,"line":297},5,[95,299,300],{"class":246},"      \"",[95,302,304],{"class":303},"sbssI","allowWrite",[95,306,259],{"class":246},[95,308,234],{"class":246},[95,310,311],{"class":246}," [",[95,313,259],{"class":246},[95,315,316],{"class":105},"~\u002F.kube",[95,318,259],{"class":246},[95,320,321],{"class":246},",",[95,323,324],{"class":246}," \"",[95,326,327],{"class":105},"\u002Ftmp\u002Fbuild",[95,329,259],{"class":246},[95,331,332],{"class":246},"]\n",[95,334,336],{"class":97,"line":335},6,[95,337,338],{"class":246},"    }\n",[95,340,342],{"class":97,"line":341},7,[95,343,344],{"class":246},"  }\n",[95,346,348],{"class":97,"line":347},8,[95,349,350],{"class":246},"}\n",[14,352,353],{},"Blokowanie odczytu całego katalogu domowego z wyjątkiem projektu:",[45,355,357],{"className":237,"code":356,"language":239,"meta":53,"style":53},"{\n  \"sandbox\": {\n    \"enabled\": true,\n    \"filesystem\": {\n      \"denyRead\": [\"~\u002F\"],\n      \"allowRead\": [\".\"]\n    }\n  }\n}\n",[38,358,359,363,375,387,399,422,443,447,451],{"__ignoreMap":53},[95,360,361],{"class":97,"line":98},[95,362,247],{"class":246},[95,364,365,367,369,371,373],{"class":97,"line":122},[95,366,252],{"class":246},[95,368,256],{"class":255},[95,370,259],{"class":246},[95,372,234],{"class":246},[95,374,264],{"class":246},[95,376,377,379,381,383,385],{"class":97,"line":267},[95,378,270],{"class":246},[95,380,273],{"class":101},[95,382,259],{"class":246},[95,384,234],{"class":246},[95,386,280],{"class":246},[95,388,389,391,393,395,397],{"class":97,"line":283},[95,390,270],{"class":246},[95,392,288],{"class":101},[95,394,259],{"class":246},[95,396,234],{"class":246},[95,398,264],{"class":246},[95,400,401,403,406,408,410,412,414,417,419],{"class":97,"line":297},[95,402,300],{"class":246},[95,404,405],{"class":303},"denyRead",[95,407,259],{"class":246},[95,409,234],{"class":246},[95,411,311],{"class":246},[95,413,259],{"class":246},[95,415,416],{"class":105},"~\u002F",[95,418,259],{"class":246},[95,420,421],{"class":246},"],\n",[95,423,424,426,429,431,433,435,437,439,441],{"class":97,"line":335},[95,425,300],{"class":246},[95,427,428],{"class":303},"allowRead",[95,430,259],{"class":246},[95,432,234],{"class":246},[95,434,311],{"class":246},[95,436,259],{"class":246},[95,438,150],{"class":105},[95,440,259],{"class":246},[95,442,332],{"class":246},[95,444,445],{"class":97,"line":341},[95,446,338],{"class":246},[95,448,449],{"class":97,"line":347},[95,450,344],{"class":246},[95,452,454],{"class":97,"line":453},9,[95,455,350],{"class":246},[14,457,458,459,461,462,464,465,467,468,471,472,474],{},"Zasada rozstrzygania konfliktów: bardziej szczegółowa ścieżka wygrywa. Wąski ",[38,460,428],{}," potrafi \"odsłonić\" fragment szerszego ",[38,463,405],{},", ale dokładny ",[38,466,405],{}," (np. ",[38,469,470],{},"~\u002F.env",") zawsze wygrywa nad szerokim ",[38,473,428],{}," — czyli szeroki allow nie może po cichu odsłonić sekretu.",[18,476,478],{"id":477},"ochrona-danych-uwierzytelniających","Ochrona danych uwierzytelniających",[14,480,481,482,485],{},"Osobny blok ",[38,483,484],{},"sandbox.credentials"," (Claude Code ≥ 2.1.187) pozwala jawnie wskazać pliki i zmienne środowiskowe do ochrony:",[45,487,489],{"className":237,"code":488,"language":239,"meta":53,"style":53},"{\n  \"sandbox\": {\n    \"enabled\": true,\n    \"credentials\": {\n      \"files\": [\n        { \"path\": \"~\u002F.aws\u002Fcredentials\", \"mode\": \"deny\" },\n        { \"path\": \"~\u002F.ssh\", \"mode\": \"deny\" }\n      ],\n      \"envVars\": [\n        { \"name\": \"GITHUB_TOKEN\", \"mode\": \"deny\" },\n        { \"name\": \"NPM_TOKEN\", \"mode\": \"deny\" }\n      ]\n    }\n  }\n}\n",[38,490,491,495,507,519,532,546,587,625,630,643,682,720,726,731,736],{"__ignoreMap":53},[95,492,493],{"class":97,"line":98},[95,494,247],{"class":246},[95,496,497,499,501,503,505],{"class":97,"line":122},[95,498,252],{"class":246},[95,500,256],{"class":255},[95,502,259],{"class":246},[95,504,234],{"class":246},[95,506,264],{"class":246},[95,508,509,511,513,515,517],{"class":97,"line":267},[95,510,270],{"class":246},[95,512,273],{"class":101},[95,514,259],{"class":246},[95,516,234],{"class":246},[95,518,280],{"class":246},[95,520,521,523,526,528,530],{"class":97,"line":283},[95,522,270],{"class":246},[95,524,525],{"class":101},"credentials",[95,527,259],{"class":246},[95,529,234],{"class":246},[95,531,264],{"class":246},[95,533,534,536,539,541,543],{"class":97,"line":297},[95,535,300],{"class":246},[95,537,538],{"class":303},"files",[95,540,259],{"class":246},[95,542,234],{"class":246},[95,544,545],{"class":246}," [\n",[95,547,548,551,553,557,559,561,563,565,567,569,571,574,576,578,580,582,584],{"class":97,"line":335},[95,549,550],{"class":246},"        {",[95,552,324],{"class":246},[95,554,556],{"class":555},"swJcz","path",[95,558,259],{"class":246},[95,560,234],{"class":246},[95,562,324],{"class":246},[95,564,220],{"class":105},[95,566,259],{"class":246},[95,568,321],{"class":246},[95,570,324],{"class":246},[95,572,573],{"class":555},"mode",[95,575,259],{"class":246},[95,577,234],{"class":246},[95,579,324],{"class":246},[95,581,177],{"class":105},[95,583,259],{"class":246},[95,585,586],{"class":246}," },\n",[95,588,589,591,593,595,597,599,601,604,606,608,610,612,614,616,618,620,622],{"class":97,"line":341},[95,590,550],{"class":246},[95,592,324],{"class":246},[95,594,556],{"class":555},[95,596,259],{"class":246},[95,598,234],{"class":246},[95,600,324],{"class":246},[95,602,603],{"class":105},"~\u002F.ssh",[95,605,259],{"class":246},[95,607,321],{"class":246},[95,609,324],{"class":246},[95,611,573],{"class":555},[95,613,259],{"class":246},[95,615,234],{"class":246},[95,617,324],{"class":246},[95,619,177],{"class":105},[95,621,259],{"class":246},[95,623,624],{"class":246}," }\n",[95,626,627],{"class":97,"line":347},[95,628,629],{"class":246},"      ],\n",[95,631,632,634,637,639,641],{"class":97,"line":453},[95,633,300],{"class":246},[95,635,636],{"class":303},"envVars",[95,638,259],{"class":246},[95,640,234],{"class":246},[95,642,545],{"class":246},[95,644,646,648,650,653,655,657,659,662,664,666,668,670,672,674,676,678,680],{"class":97,"line":645},10,[95,647,550],{"class":246},[95,649,324],{"class":246},[95,651,652],{"class":555},"name",[95,654,259],{"class":246},[95,656,234],{"class":246},[95,658,324],{"class":246},[95,660,661],{"class":105},"GITHUB_TOKEN",[95,663,259],{"class":246},[95,665,321],{"class":246},[95,667,324],{"class":246},[95,669,573],{"class":555},[95,671,259],{"class":246},[95,673,234],{"class":246},[95,675,324],{"class":246},[95,677,177],{"class":105},[95,679,259],{"class":246},[95,681,586],{"class":246},[95,683,685,687,689,691,693,695,697,700,702,704,706,708,710,712,714,716,718],{"class":97,"line":684},11,[95,686,550],{"class":246},[95,688,324],{"class":246},[95,690,652],{"class":555},[95,692,259],{"class":246},[95,694,234],{"class":246},[95,696,324],{"class":246},[95,698,699],{"class":105},"NPM_TOKEN",[95,701,259],{"class":246},[95,703,321],{"class":246},[95,705,324],{"class":246},[95,707,573],{"class":555},[95,709,259],{"class":246},[95,711,234],{"class":246},[95,713,324],{"class":246},[95,715,177],{"class":105},[95,717,259],{"class":246},[95,719,624],{"class":246},[95,721,723],{"class":97,"line":722},12,[95,724,725],{"class":246},"      ]\n",[95,727,729],{"class":97,"line":728},13,[95,730,338],{"class":246},[95,732,734],{"class":97,"line":733},14,[95,735,344],{"class":246},[95,737,739],{"class":97,"line":738},15,[95,740,350],{"class":246},[14,742,743,744,747,748,221,751,754,755,758],{},"Ważne: nie ma wbudowanej domyślnej listy sekretów do ochrony — chronione jest tylko to, co jawnie wymienisz. Tryb ",[38,745,746],{},"mask"," (Claude Code ≥ 2.1.199) pozwala zachować działanie narzędzi typu ",[38,749,750],{},"gh",[38,752,753],{},"npm",", podstawiając prawdziwy token dopiero na poziomie proxy sieciowego, tylko dla wskazanych hostów (",[38,756,757],{},"injectHosts",") — sama komenda nigdy nie widzi prawdziwego sekretu.",[18,760,762],{"id":761},"sieć-model-domyślnie-zero-zaufania","Sieć — model \"domyślnie zero zaufania\"",[14,764,765,766,234],{},"Żadna domena nie jest dozwolona domyślnie. Pierwsze użycie nowej domeny wywołuje pytanie o zgodę; można to obejść z góry, wypełniając ",[38,767,768],{},"allowedDomains",[45,770,772],{"className":237,"code":771,"language":239,"meta":53,"style":53},"{\n  \"sandbox\": {\n    \"enabled\": true,\n    \"network\": {\n      \"allowedDomains\": [\"*.github.com\", \"registry.npmjs.org\"]\n    }\n  }\n}\n",[38,773,774,778,790,802,815,845,849,853],{"__ignoreMap":53},[95,775,776],{"class":97,"line":98},[95,777,247],{"class":246},[95,779,780,782,784,786,788],{"class":97,"line":122},[95,781,252],{"class":246},[95,783,256],{"class":255},[95,785,259],{"class":246},[95,787,234],{"class":246},[95,789,264],{"class":246},[95,791,792,794,796,798,800],{"class":97,"line":267},[95,793,270],{"class":246},[95,795,273],{"class":101},[95,797,259],{"class":246},[95,799,234],{"class":246},[95,801,280],{"class":246},[95,803,804,806,809,811,813],{"class":97,"line":283},[95,805,270],{"class":246},[95,807,808],{"class":101},"network",[95,810,259],{"class":246},[95,812,234],{"class":246},[95,814,264],{"class":246},[95,816,817,819,821,823,825,827,829,832,834,836,838,841,843],{"class":97,"line":297},[95,818,300],{"class":246},[95,820,768],{"class":303},[95,822,259],{"class":246},[95,824,234],{"class":246},[95,826,311],{"class":246},[95,828,259],{"class":246},[95,830,831],{"class":105},"*.github.com",[95,833,259],{"class":246},[95,835,321],{"class":246},[95,837,324],{"class":246},[95,839,840],{"class":105},"registry.npmjs.org",[95,842,259],{"class":246},[95,844,332],{"class":246},[95,846,847],{"class":97,"line":335},[95,848,338],{"class":246},[95,850,851],{"class":97,"line":341},[95,852,344],{"class":246},[95,854,855],{"class":97,"line":347},[95,856,350],{"class":246},[14,858,859,862,863,865,866,869],{},[64,860,861],{},"Istotne ograniczenie bezpieczeństwa",": wbudowane proxy domyślnie ",[29,864,216],{}," terminuje ani nie inspekcjonuje ruchu TLS — decyzję o dopuszczeniu podejmuje wyłącznie na podstawie nazwy hosta podanej przez klienta. Oznacza to, że szeroka reguła w stylu ",[38,867,868],{},"github.com"," teoretycznie otwiera drogę do technik takich jak domain fronting. Jeśli model zagrożenia tego wymaga, trzeba skonfigurować własne proxy terminujące TLS.",[18,871,873],{"id":872},"wymuszanie-sandboksa-w-organizacji","Wymuszanie sandboksa w organizacji",[14,875,876,877,879],{},"Dla administratorów — konfiguracja przez managed settings, której deweloperzy nie mogą lokalnie poluzować (dla kluczy logicznych typu ",[38,878,273],{},"):",[45,881,883],{"className":237,"code":882,"language":239,"meta":53,"style":53},"{\n  \"sandbox\": {\n    \"enabled\": true,\n    \"failIfUnavailable\": true,\n    \"allowUnsandboxedCommands\": false\n  }\n}\n",[38,884,885,889,901,913,926,939,943],{"__ignoreMap":53},[95,886,887],{"class":97,"line":98},[95,888,247],{"class":246},[95,890,891,893,895,897,899],{"class":97,"line":122},[95,892,252],{"class":246},[95,894,256],{"class":255},[95,896,259],{"class":246},[95,898,234],{"class":246},[95,900,264],{"class":246},[95,902,903,905,907,909,911],{"class":97,"line":267},[95,904,270],{"class":246},[95,906,273],{"class":101},[95,908,259],{"class":246},[95,910,234],{"class":246},[95,912,280],{"class":246},[95,914,915,917,920,922,924],{"class":97,"line":283},[95,916,270],{"class":246},[95,918,919],{"class":101},"failIfUnavailable",[95,921,259],{"class":246},[95,923,234],{"class":246},[95,925,280],{"class":246},[95,927,928,930,932,934,936],{"class":97,"line":297},[95,929,270],{"class":246},[95,931,76],{"class":101},[95,933,259],{"class":246},[95,935,234],{"class":246},[95,937,938],{"class":246}," false\n",[95,940,941],{"class":97,"line":335},[95,942,344],{"class":246},[95,944,945],{"class":97,"line":341},[95,946,350],{"class":246},[58,948,949,954],{},[61,950,951,953],{},[38,952,919],{}," — brak wymaganej zależności (np. bubblewrap) blokuje start Claude Code zamiast ciche uruchomienie bez izolacji",[61,955,956,959,960,963],{},[38,957,958],{},"allowUnsandboxedCommands: false"," — wyłącza furtkę ",[38,961,962],{},"dangerouslyDisableSandbox",", więc żadna komenda nie może \"uciec\" z sandboksa",[14,965,966,967,970,971,974,975,978],{},"Warto dodać ",[38,968,969],{},"allowManagedDomainsOnly"," i ",[38,972,973],{},"allowManagedReadPathsOnly",", żeby zablokować deweloperom możliwość rozszerzania listy dozwolonych domen\u002Fścieżek lokalnie — pola tablicowe (np. ",[38,976,977],{},"excludedCommands",") domyślnie łączą się ze wszystkich zakresów ustawień, więc deweloper i tak może coś dopisać.",[18,980,982],{"id":981},"czego-sandbox-nie-robi","Czego sandbox NIE robi",[58,984,985,988,995,1001,1012],{},[61,986,987],{},"Obejmuje wyłącznie proces Bash i jego procesy potomne — narzędzia Read\u002FEdit\u002FWrite działają przez osobny system uprawnień",[61,989,990,991,994],{},"Nie jest pełną izolacją: przy ",[38,992,993],{},"enableWeakerNestedSandbox"," (np. w kontenerze bez uprzywilejowanych namespace'ów) izolacja jest wyraźnie słabsza",[61,996,997,1000],{},[38,998,999],{},"allowAppleEvents"," na macOS usuwa izolację uruchamiania innych aplikacji",[61,1002,1003,1004,1007,1008,1011],{},"Zmienna ",[38,1005,1006],{},"docker.sock"," udostępniona przez ",[38,1009,1010],{},"allowUnixSockets"," praktycznie daje pełny dostęp do hosta",[61,1013,1014],{},"To redukcja ryzyka, nie twierdza nie do zdobycia — dokumentacja Anthropic wprost to podkreśla",[1016,1017],"hr",{},[18,1019,1021],{"id":1020},"realne-przypadki-prompt-injection-z-życia","Realne przypadki prompt injection z życia",[14,1023,1024],{},"Poniżej udokumentowane, publicznie ujawnione incydenty — nie hipotezy z artykułów akademickich, tylko konkretne CVE i raporty badaczy bezpieczeństwa.",[1026,1027,1029],"h3",{"id":1028},"_1-echoleak-microsoft-365-copilot-cve-2025-32711-cvss-93","1. EchoLeak — Microsoft 365 Copilot (CVE-2025-32711, CVSS 9.3)",[14,1031,1032],{},"W czerwcu 2025 badacze Aim Security ujawnili pierwszy udokumentowany atak typu zero-click prompt injection na produkcyjny system AI. Wystarczył jeden spreparowany e-mail, bez żadnej interakcji użytkownika, by Copilot uzyskał dostęp do plików wewnętrznych i przesłał ich zawartość na serwer kontrolowany przez atakującego. Ukryte instrukcje trafiały do modelu podczas rutynowego podsumowywania wiadomości — antywirusy, firewalle i skanowanie statyczne nie miały tu nic do powiedzenia, bo atak działał w naturalnym języku, nie w kodzie.",[1026,1034,1036],{"id":1035},"_2-slack-ai-wyciek-z-prywatnych-kanałów-sierpień-2024","2. Slack AI — wyciek z prywatnych kanałów (sierpień 2024)",[14,1038,1039],{},"Badacze PromptArmor ujawnili lukę w Slack AI, która pozwalała atakującemu wykraść dane z prywatnych kanałów Slacka, do których nie miał dostępu — w tym klucze API udostępnione w prywatnych kanałach deweloperskich — poprzez umieszczenie złośliwej instrukcji na kanale publicznym lub w załączonym dokumencie.",[1026,1041,1043],{"id":1042},"_3-poisoning-claude-code-łańcuch-dostaw-przez-github-action","3. Poisoning Claude Code — łańcuch dostaw przez GitHub Action",[14,1045,1046,1047,1050],{},"W styczniu 2026 badacz RyotaK (GMO Flatt Security) ujawnił krytyczną lukę w ",[38,1048,1049],{},"claude-code-action"," Anthropica. Osiem dni po ujawnieniu, nieznany podmiot wykorzystał niezałataną lukę, by opublikować nieautoryzowane wydanie instalujące agenta OpenClaw na każdym systemie deweloperskim i CI\u002FCD, który zaktualizował Cline CLI. Pakiet pozostawał aktywny przez około osiem godzin, zanim token npm został unieważniony. To jeden z pierwszych w pełni udokumentowanych przypadków kompromitacji własnej infrastruktury dystrybucji narzędzia AI, przeprowadzonej przez agenta, który to narzędzie samo obsługiwało.",[1026,1052,1054,1055,1058],{"id":1053},"_4-wyciek-klucza-api-przez-procselfenviron-w-claude-code-github-action","4. Wyciek klucza API przez ",[38,1056,1057],{},"\u002Fproc\u002Fself\u002Fenviron"," w Claude Code GitHub Action",[14,1060,1061,1062,1064,1065,150],{},"Microsoft Security Blog opisał (czerwiec 2026) atak, w którym prompt injection z publicznego repozytorium (treść issue\u002FPR) skłoniła Claude Code do bezpośredniego odczytu ",[38,1063,1057],{}," narzędziem Read. Zwrócony blob environ zawierał nieoczyszczony klucz ANTHROPIC_API_KEY. Atakujący mógł następnie wykorzystać dowolny kanał eksfiltracji dostępny w danym workflow — kontrolowaną domenę przez WebFetch lub Bash, komentarz w issue przez GitHub MCP, albo log akcji. Anthropic załatało to w Claude Code 2.1.128, blokując dostęp do wrażliwych plików ",[38,1066,1067],{},"\u002Fproc",[1026,1069,1071],{"id":1070},"_5-agentjacking-przez-sentry-atak-na-claude-code-cursor-i-codex-jednocześnie","5. Agentjacking przez Sentry — atak na Claude Code, Cursor i Codex jednocześnie",[14,1073,1074],{},"Ujawniony w czerwcu 2026 przez Tenet Security atak nie wymagał żadnego naruszenia zabezpieczeń. Pojedyncze, spreparowane zdarzenie błędu wysłane przez publiczny klucz uwierzytelniający Sentry — nie wymagający żadnego złamania zabezpieczeń ani autoryzacji — wstrzykiwało instrukcje atakującego do danych o błędzie, które Claude Code, Cursor i Codex następnie wykonywały jako zaufane dane diagnostyczne. Tenet przetestował ponad 100 celów w kontrolowanych warunkach, osiągając 85% skuteczności, a firma zidentyfikowała blisko 2400 organizacji z publicznie wystawionymi danymi uwierzytelniającymi Sentry podatnymi na tę technikę. Sentry określiło tę lukę jako \"technicznie nie do obrony\".",[1026,1076,1078],{"id":1077},"_6-check-point-zdalne-wykonanie-kodu-przez-hooki-w-ustawieniach-repo","6. Check Point — zdalne wykonanie kodu przez hooki w ustawieniach repo",[14,1080,1081],{},"CVE-2025-59536 pozwalało na zdalne wykonanie kodu poprzez złośliwe hooki umieszczone w pliku ustawień repozytorium — kod uruchamiał się jeszcze zanim użytkownik zdążył przeczytać okno dialogowe zaufania. Drugie, CVE-2026-21852, umożliwiało wykradzenie klucza API poprzez nadpisanie jednej zmiennej środowiskowej, przekierowując uwierzytelniony ruch do infrastruktury atakującego jeszcze przed jakimkolwiek promptem zgody. W obu przypadkach samo sklonowanie i otwarcie niezaufanego repozytorium wystarczało, by wyzwolić atak.",[1026,1083,1085],{"id":1084},"_7-claudy-day-inwazyjny-prompt-injection-przez-parametr-url-na-claudeai","7. \"Claudy Day\" — inwazyjny prompt injection przez parametr URL na claude.ai",[14,1087,1088],{},"Badacze Oasis Security opisali w marcu 2026 pełny łańcuch ataku na domyślnej, standardowej sesji claude.ai. Claude.ai pozwala otworzyć nowy czat z wcześniej wypełnionym promptem poprzez parametr URL. Odkryto, że pewne znaczniki HTML dało się osadzić w tym parametrze — niewidoczne w polu tekstowym, ale w pełni przetwarzane przez Claude po naciśnięciu Enter. Atakujący mógł ukryć dowolne instrukcje, łącznie z poleceniami ekstrakcji danych, w tym co wyglądało jak normalny prompt — bez żadnych integracji, narzędzi czy serwerów MCP. Podatność została naprawiona.",[1026,1090,1092],{"id":1091},"_8-perplexity-comet-przeglądarka-agentowa-przejęta-przez-zaproszenie-kalendarzowe","8. Perplexity Comet — przeglądarka agentowa przejęta przez zaproszenie kalendarzowe",[14,1094,1095],{},"Zenity Labs ujawniło, że agentowa przeglądarka Perplexity Comet może zostać przejęta poprzez złośliwe zaproszenie kalendarzowe zawierające ładunek prompt injection, co powodowało dostęp do lokalnego systemu plików, przeglądanie katalogów, otwieranie i odczyt plików oraz eksfiltrację danych. Atak nie wymaga żadnej interakcji użytkownika poza zaakceptowaniem tego, co wygląda na zwyczajne zaproszenie na spotkanie.",[1026,1097,1099],{"id":1098},"_9-microsoft-semantic-kernel-rce-z-dowolnego-wektora-prompt-injection","9. Microsoft Semantic Kernel — RCE z dowolnego wektora prompt injection",[14,1101,1102],{},"Zespół Microsoft Defender Security Research zidentyfikował dwie krytyczne podatności w Semantic Kernel — CVE-2026-26030 (SDK Python) i CVE-2026-25592 (SDK .NET) — gdzie atakujący dysponujący jakimkolwiek wektorem prompt injection mógł osiągnąć zdalne wykonanie kodu na maszynie hostującej agenta.",[1026,1104,1106],{"id":1105},"_10-skala-zjawiska-w-liczbach","10. Skala zjawiska w liczbach",[14,1108,1109],{},"Według raportu CrowdStrike 2026 Global Threat Report, przeciwnicy wstrzykiwali złośliwe prompty do legalnych narzędzi generatywnej AI w ponad 90 organizacjach w 2025 roku, wykorzystując te wstrzyknięcia do generowania poleceń kradnących dane uwierzytelniające i kryptowaluty. Raport podsumowuje to wprost: prompty to nowe malware, a wolumen ataków wspieranych przez AI wzrósł w tym okresie o 89% rok do roku.",[1016,1111],{},[18,1113,1115],{"id":1114},"wnioski-praktyczne","Wnioski praktyczne",[14,1117,1118],{},"Wspólny mianownik tych incydentów: atakujący prawie nigdy nie rozmawia bezpośrednio z modelem. Ładunek trafia przez treść, którą agent i tak musi przetworzyć jako część legalnego zadania — komentarz w kodzie, zgłoszenie błędu, e-mail, zaproszenie kalendarzowe, plik ustawień repozytorium. To właśnie dlatego warstwa OS-level sandboxingu ma sens niezależnie od tego, jak dobrze wytrenowany jest model: sandbox nie próbuje rozpoznać złośliwej instrukcji w treści, tylko ogranicza, co jakakolwiek komenda — złośliwa czy nie — może faktycznie zrobić.",[14,1120,1121],{},"Praktyczny minimalny zestaw działań przy pracy z niezaufaną treścią (obce repozytoria, zewnętrzne issue, dane z MCP):",[1123,1124,1125,1131,1143,1152,1161],"ol",{},[61,1126,1127,1128,1130],{},"Włącz sandbox (",[38,1129,160],{},") i traktuj auto-allow jako domyślny tryb pracy",[61,1132,1133,1134,1136,1137,1140,1141],{},"Jawnie zablokuj odczyt katalogów z sekretami (",[38,1135,603],{},", ",[38,1138,1139],{},"~\u002F.aws",") przez ",[38,1142,484],{},[61,1144,1145,1146,1148,1149,1151],{},"Ogranicz ",[38,1147,768],{}," do konkretnych, zaufanych hostów — unikaj szerokich wildcardów typu ",[38,1150,831],{},", jeśli to możliwe",[61,1153,1154,1155,1157,1158],{},"W CI\u002FCD wyłącz ",[38,1156,76],{}," i ustaw ",[38,1159,1160],{},"failIfUnavailable: true",[61,1162,1163],{},"Audytuj serwery MCP przed instalacją tak samo, jak dowolną zależność npm — pod kątem dostępu do plików, wywołań sieciowych i wstrzykniętych promptów systemowych",[1165,1166,1167],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":53,"searchDepth":122,"depth":122,"links":1169},[1170,1171,1173,1174,1175,1176,1177,1178,1179,1192],{"id":20,"depth":122,"text":21},{"id":35,"depth":122,"text":1172},"Szybki start: \u002Fsandbox",{"id":167,"depth":122,"text":168},{"id":209,"depth":122,"text":210},{"id":477,"depth":122,"text":478},{"id":761,"depth":122,"text":762},{"id":872,"depth":122,"text":873},{"id":981,"depth":122,"text":982},{"id":1020,"depth":122,"text":1021,"children":1180},[1181,1182,1183,1184,1186,1187,1188,1189,1190,1191],{"id":1028,"depth":267,"text":1029},{"id":1035,"depth":267,"text":1036},{"id":1042,"depth":267,"text":1043},{"id":1053,"depth":267,"text":1185},"4. Wyciek klucza API przez \u002Fproc\u002Fself\u002Fenviron w Claude Code GitHub Action",{"id":1070,"depth":267,"text":1071},{"id":1077,"depth":267,"text":1078},{"id":1084,"depth":267,"text":1085},{"id":1091,"depth":267,"text":1092},{"id":1098,"depth":267,"text":1099},{"id":1105,"depth":267,"text":1106},{"id":1114,"depth":122,"text":1115},"2026-07-18","Praktyczny przewodnik po sandboxingu w Claude Code oraz rzeczywistych incydentach prompt injection, które pokazują, dlaczego izolacja agentów AI jest niezbędna.","md","\u002Fimages\u002Fblog\u002Fclaude-code-sandboxing.svg","pl",{},true,"\u002Fblog\u002Fclaude-code-sandboxing",{"title":5,"description":1194},"claude-code-sandboxing","blog\u002Fclaude-code-sandboxing",[1205,1206,1207],"Claude Code","Bezpieczeństwo AI","Sandboxing","0ALS959xMyR5v5sTO_3oOCggob4YuoEDmdQ1Ka5rvFs",1784390856989]