{"id":33,"date":"2026-07-20T19:00:00","date_gmt":"2026-07-20T17:00:00","guid":{"rendered":"https:\/\/airex.se\/blogg\/sandlada-for-genererad-kod\/"},"modified":"2026-08-04T16:26:49","modified_gmt":"2026-08-04T14:26:49","slug":"sandlada-for-genererad-kod","status":"publish","type":"post","link":"https:\/\/airex.se\/blogg\/sandlada-for-genererad-kod\/","title":{"rendered":"Att k\u00f6ra kod som en spr\u00e5kmodell skrivit \u2014 utan att bli hackad"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Anv\u00e4ndaren laddar upp ett kalkylblad och skriver vad som ska \u00e4ndras med egna ord. En spr\u00e5kmodell skriver Python-kod. Koden k\u00f6rs mot filen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e4s den sista meningen igen. Det \u00e4r en av de mest riskabla konstruktioner man kan bygga, och den blir vanligare f\u00f6r varje m\u00e5nad \u2014 f\u00f6r den \u00e4r ocks\u00e5 oerh\u00f6rt anv\u00e4ndbar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Det som inte fungerar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Den vanligaste &#8221;l\u00f6sningen&#8221; \u00e4r att skriva i systemprompten att modellen inte f\u00e5r generera skadlig kod.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det \u00e4r ingen s\u00e4kerhets\u00e5tg\u00e4rd. Det \u00e4r en artighetsfras. En prompt \u00e4r indata, och indata kan p\u00e5verkas \u2014 texten i kalkylbladet \u00e4r ocks\u00e5 indata, och en cell kan inneh\u00e5lla instruktioner. <strong>Modellen kan aldrig vara s\u00e4kerhetsgr\u00e4nsen, eftersom det \u00e4r modellen som \u00e4r den op\u00e5litliga komponenten.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gr\u00e4nsen m\u00e5ste ligga i vad koden <em>kan<\/em> g\u00f6ra, inte i vad n\u00e5gon bett den l\u00e5ta bli.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fyra lager, f\u00f6r att vart och ett g\u00e5r att ta sig f\u00f6rbi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ett: l\u00e4s koden som kod, inte som text.<\/strong> Innan n\u00e5got k\u00f6rs parsas den genererade koden till ett syntaxtr\u00e4d, och allt som importerar utanf\u00f6r en sn\u00e4v lista avvisas \u2014 kalkylbladsbibliotek, textbehandling, n\u00e5gra standardmoduler, punkt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Att i st\u00e4llet s\u00f6ka efter textstr\u00e4ngen <code>import os<\/code> \u00e4r meningsl\u00f6st; det finns ett dussin s\u00e4tt att n\u00e5 samma modul utan att skriva orden. Ett syntaxtr\u00e4d beskriver vad koden faktiskt g\u00f6r, inte hur den ser ut. Men \u00e4ven en vitlista g\u00e5r att kringg\u00e5 via omv\u00e4gar i spr\u00e5ket \u2014 vilket \u00e4r hela sk\u00e4let till att det finns tre lager till.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tv\u00e5: byt ut filhanteringen.<\/strong> Inne i sandl\u00e5dan \u00e4r den vanliga funktionen f\u00f6r att \u00f6ppna filer ersatt med en egen som l\u00f6ser upp s\u00f6kv\u00e4gen och v\u00e4grar allt utanf\u00f6r tv\u00e5 kataloger: en att l\u00e4sa fr\u00e5n och en att skriva till. Koden kan inte r\u00f6ra n\u00e5got annat p\u00e5 filsystemet, oavsett vad den f\u00f6rs\u00f6ker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tre: en container som inte kan s\u00e5 mycket.<\/strong> Det h\u00e4r \u00e4r den riktiga gr\u00e4nsen, och den \u00e4r byggd av operativsystemet snarare \u00e4n av min kod:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inget n\u00e4tverk alls.<\/strong> Ingen utg\u00e5ende anslutning finns att g\u00f6ra. \u00c4ven om koden fick tag i n\u00e5got k\u00e4nsligt kan den inte skicka det n\u00e5gonstans.<\/li>\n<li><strong>Skrivskyddat filsystem<\/strong> utom de tv\u00e5 arbetskatalogerna. Ingenting kan l\u00e4mnas kvar till n\u00e4sta k\u00f6rning.<\/li>\n<li><strong>K\u00f6r som en anv\u00e4ndare utan r\u00e4ttigheter<\/strong>, med flaggan som g\u00f6r att processen aldrig kan h\u00f6ja sina egna privilegier.<\/li>\n<li><strong>Minne, processorandel och antal processer \u00e4r begr\u00e4nsade.<\/strong> En o\u00e4ndlig loop eller en processbomb tar ner sin egen container och ingenting annat.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Po\u00e4ngen med den uppr\u00e4kningen \u00e4r att varje rad st\u00e4nger en <em>utfallskategori<\/em>, inte ett specifikt angrepp. Jag beh\u00f6ver inte f\u00f6rutse vad koden f\u00f6rs\u00f6ker g\u00f6ra.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fyra: en m\u00e4nniska ser skillnaden.<\/strong> Resultatet presenteras som en diff p\u00e5 cellniv\u00e5 \u2014 exakt vilka rutor som \u00e4ndrats, fr\u00e5n vad till vad \u2014 innan anv\u00e4ndaren laddar ner n\u00e5got. Ingen fil ers\u00e4tts automatiskt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det sista lagret \u00e4r det jag skulle vara minst villig att offra. De tre f\u00f6rsta skyddar mot skadlig kod. Det fj\u00e4rde skyddar mot n\u00e5got mycket vanligare: kod som \u00e4r fullst\u00e4ndigt ofarlig och g\u00f6r helt fel sak.<\/p>\n\n\n\n<figure class=\"airex-fig\">\n<svg viewBox=\"0 0 720 300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\"\n     aria-label=\"Fyra lager kring genererad kod: syntaxgranskning, filsp\u00e4rr, container utan n\u00e4tverk, och en m\u00e4nniska som ser skillnaden\">\n  <style>\n    .t { font-family:\"Familjen Grotesk\", system-ui, sans-serif; font-weight:700; font-size:14px; fill:#0e1a1c; }\n    .m { font-family:\"IBM Plex Mono\", ui-monospace, monospace; font-size:10px; fill:#78898a; letter-spacing:.1em; }\n    .b { font-family:Newsreader, Georgia, serif; font-size:12.5px; fill:#3a4c4d; }\n    .lay { fill:none; stroke:#0e1a1c; stroke-width:1.4; }\n    .core { fill:#a5381f; opacity:.12; stroke:#a5381f; stroke-width:1.4; }\n  <\/style>\n\n  <rect class=\"lay\" x=\"20\"  y=\"20\" width=\"470\" height=\"260\"\/>\n  <rect class=\"lay\" x=\"52\"  y=\"52\" width=\"406\" height=\"196\"\/>\n  <rect class=\"lay\" x=\"84\"  y=\"84\" width=\"342\" height=\"132\"\/>\n  <rect class=\"core\" x=\"116\" y=\"116\" width=\"278\" height=\"68\"\/>\n\n  <text class=\"m\" x=\"34\"  y=\"42\">1 \u00b7 SYNTAXTR\u00c4D \u2014 VITLISTA F\u00d6R IMPORTER<\/text>\n  <text class=\"m\" x=\"66\"  y=\"74\">2 \u00b7 FIL\u00c5TKOMST BEGR\u00c4NSAD TILL TV\u00c5 KATALOGER<\/text>\n  <text class=\"m\" x=\"98\"  y=\"106\">3 \u00b7 CONTAINER: INGET N\u00c4T, SKRIVSKYDDAD, UTAN R\u00c4TTIGHETER<\/text>\n  <text class=\"t\" x=\"130\" y=\"146\">Genererad kod<\/text>\n  <text class=\"b\" x=\"130\" y=\"168\">antas vara fientlig<\/text>\n\n  <path stroke=\"#0e1a1c\" stroke-width=\"1.4\" fill=\"none\" marker-end=\"url(#ar)\" d=\"M490 150 L560 150\"\/>\n  <defs><marker id=\"ar\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto\">\n    <path d=\"M0 0 L10 5 L0 10 z\" fill=\"#0e1a1c\"\/><\/marker><\/defs>\n\n  <rect class=\"lay\" x=\"565\" y=\"104\" width=\"135\" height=\"92\"\/>\n  <text class=\"m\" x=\"578\" y=\"128\">4 \u00b7 M\u00c4NNISKA<\/text>\n  <text class=\"t\" x=\"578\" y=\"152\">Ser diffen<\/text>\n  <text class=\"b\" x=\"578\" y=\"174\">f\u00f6re nedladdning<\/text>\n\n  <text class=\"b\" x=\"20\" y=\"296\">Varje lager g\u00e5r att ta sig f\u00f6rbi. Det \u00e4r d\u00e4rf\u00f6r de \u00e4r fyra.<\/text>\n<\/svg>\n<figcaption>Fyra lager. Vart och ett g\u00e5r att ta sig f\u00f6rbi \u2014 det \u00e4r d\u00e4rf\u00f6r de \u00e4r fyra.<\/figcaption>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Fel sak \u00e4r det troliga felet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det \u00e4r l\u00e4tt att bli s\u00e5 upptagen av angreppsscenarier att man missar var risken faktiskt ligger i vardagen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ingen har f\u00f6rs\u00f6kt bryta sig ut ur sandl\u00e5dan hos mig. D\u00e4remot har genererad kod tolkat &#8221;ta bort de tomma raderna&#8221; som att den skulle ta bort rader som s\u00e5g tomma ut men inneh\u00f6ll mellanslag. Den koden \u00e4r harml\u00f6s enligt varje s\u00e4kerhetsmodell, och den hade f\u00f6rst\u00f6rt ett underlag om ingen tittat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e4rf\u00f6r \u00e4r diffen inte en trevlig detalj i gr\u00e4nssnittet. Den \u00e4r den kontroll som f\u00e5ngar det som verkligen h\u00e4nder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e5 vet du att det funkar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Testa sandl\u00e5dan genom att attackera den, inte genom att anv\u00e4nda den.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Be den uttryckligen om n\u00e5got f\u00f6rbjudet.<\/strong> &#8221;Skriv kod som listar filerna i rotkatalogen.&#8221; Avvisas den innan k\u00f6rning fungerar det f\u00f6rsta lagret.<\/li>\n<li><strong>Kringg\u00e5 det f\u00f6rsta lagret med flit<\/strong> \u2014 n\u00e5 en modul via en omv\u00e4g i spr\u00e5ket. Kommer koden igenom granskningen men misslyckas \u00e4nd\u00e5, d\u00e5 \u00e4r det containern som h\u00e5ller, vilket \u00e4r precis meningen.<\/li>\n<li><strong>F\u00f6rs\u00f6k n\u00e5 n\u00e4tverket.<\/strong> Ett anrop ut\u00e5t ska misslyckas direkt, inte h\u00e4nga i en timeout. H\u00e4nger det \u00e4r n\u00e4tverket avst\u00e4ngt p\u00e5 fel s\u00e4tt.<\/li>\n<li><strong>K\u00f6r en o\u00e4ndlig loop<\/strong> och kontrollera att bara sandl\u00e5dan p\u00e5verkas medan resten av tj\u00e4nsten svarar som vanligt.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ett skydd du aldrig sett utl\u00f6sa \u00e4r ett skydd du inte vet n\u00e5got om.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad jag tar med mig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sluta fr\u00e5ga om modellen \u00e4r p\u00e5litlig.<\/strong> Fr\u00e5ga vad som h\u00e4nder n\u00e4r den inte \u00e4r det. Kod som genereras av en modell ska behandlas precis som kod inskickad av en ok\u00e4nd anv\u00e4ndare \u00f6ver internet \u2014 f\u00f6r det \u00e4r exakt vad den \u00e4r, med ett extra led emellan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Lager, f\u00f6r att varje enskilt lager g\u00e5r att ta sig f\u00f6rbi.<\/strong> Vitlistan g\u00e5r att lura. Filfunktionen skulle kunna ha ett h\u00e5l. Containern \u00e4r det starkaste ledet, men \u00e4ven den vilar p\u00e5 att k\u00e4rnan g\u00f6r sitt jobb. Att stapla dem g\u00f6r att ett misstag i ett lager inte blir ett haveri.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Och den obekv\u00e4ma:<\/strong> allt det h\u00e4r kostade mer arbete \u00e4n funktionen i sig. Att f\u00e5 en modell att skriva kod som \u00e4ndrar ett kalkylblad tog en kv\u00e4ll. Att g\u00f6ra det s\u00e5 att jag v\u00e5gar l\u00e5ta n\u00e5gon annan anv\u00e4nda det tog betydligt l\u00e4ngre. Det \u00e4r, misst\u00e4nker jag, den verkliga skiljelinjen mellan en demo och en produkt.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Att skriva i prompten att modellen inte f\u00e5r generera skadlig kod \u00e4r ingen s\u00e4kerhets\u00e5tg\u00e4rd, det \u00e4r en artighetsfras. Fyra lager som var f\u00f6r sig g\u00e5r att ta sig f\u00f6rbi.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-33","post","type-post","status-publish","format-standard","hentry","category-ai-i-praktiken"],"_links":{"self":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/comments?post=33"}],"version-history":[{"count":1,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/33\/revisions"}],"predecessor-version":[{"id":52,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/33\/revisions\/52"}],"wp:attachment":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/media?parent=33"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/categories?post=33"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/tags?post=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}