Sikkerhetskontroller
Denne siden er skrevet for sikkerhetsteam og revisorer som skal vurdere Revizo AI. Den beskriver hver kontroll i rekkefølgen den kjører, hvilke trusler den adresserer, og hva vi bevisst ikke påstår.
Kontrollkjeden
Hver chat-forespørsel passerer disse kontrollene. En forespørsel som stoppes tidlig når aldri modellen.
| # | Kontroll | Implementasjon | Trussel som adresseres |
|---|---|---|---|
| 1 | Autentisering | withTenant leser Clerk-sesjon server-side. tenantId og userId kan ikke settes av klienten. | Uautentisert bruk, tenant-spoofing via parametre |
| 2 | Rolle | Chat er et skriveendepunkt (POST). Rollen Leser (org:viewer) avvises. | Lesebrukere som utfører handlinger |
| 3 | AI-policy | Fail-closed: ukjent organisasjon eller manglende innstilling behandles som avslått. Sjekkes før noe sendes til leverandør. | Behandling organisasjonen har valgt bort |
| 4 | Månedskvote | Administrator kan sette tak på tokens og antall chatter per måned. | Kostnadsløp, misbruk |
| 5 | Hastighetsgrense | 10 chat-forespørsler per minutt per bruker, i tillegg til global grense. | Automatisert misbruk, uthenting i stor skala |
| 6 | Inputvalidering | Meldinger, bilder (maks 4, typebegrenset, størrelsesbegrenset), samtale-ID, oppgave-ID og selskaps-ID valideres. Ugyldig selskaps-ID forkastes stille i stedet for å feile. | Injeksjon via parametre, DoS med store nyttelaster |
| 7 | Klassifisering | Regelbasert klassifisering. Åpenbart off-topic (kode, dikt, politikk, generelle fakta) avvises uten modellkall. | Misbruk av modellen som generell tjeneste, kostnad |
| 8 | Kontekst | Hvert oppslag har tenant_id = sesjonens organisasjon. Klient- og selskapsnavn hentes bare når objektet tilhører organisasjonen; ellers utelates det. Oppgavekontekst bruker samme synlighetsregel som resten av appen. | Kryss-tenant lekkasje via kontekst, opplisting av andres objekter |
| 9 | Verktøyautorisasjon | Hver håndterer mottar orgId og userId fra sesjonen og filtrerer på dem. Modellens argumenter er forslag; håndtereren verifiserer eierskap (for eksempel validateClientTenant før Smart Match). | Modellen manipuleres til å be om fremmede data |
| 10 | Kortvalidering | Kort med ugyldig form forkastes. Maks ett valgkort per svar. Kortets nyttelast fjernes fra det modellen får se. | Halvferdige eller forfalskede handlinger, lekkasje via verktøyresultat |
| 11 | Svarfilter | Blokkerte mønstre (rådgivningsformuleringer, personnummer, bankkontonummer) erstattes. Pålagte forbehold legges til for frister, skatteregler og lovsitater. Lekket verktøysyntaks strippes. | Utilsiktet rådgivning, PII i svar |
| 12 | Lagring og revisjonsspor | Samtale, verktøy brukt og forbruk lagres i organisasjonens tenant. Skrivende verktøy logger til hendelsesloggen. | Manglende sporbarhet |
Trusselmodell
Prompt injection
Prompt injection er forsøk på å få modellen til å bryte instruksen — via brukerens egen tekst, via innhold i et skjermbilde, eller via data som kommer tilbake fra et verktøy (for eksempel en oppgavetittel skrevet av noen andre).
Vårt standpunkt er at instruksen til modellen ikke er en sikkerhetsgrense. Vi antar at modellen kan bli manipulert, og designer slik at det ikke gir angriperen noe:
| Hvis modellen manipuleres til å … | Hva som skjer |
|---|---|
| be om data fra en annen organisasjon | Verktøyet filtrerer på sesjonens tenant_id. Tomt resultat. |
| be om en oppgave brukeren ikke kan se | Synlighetsfilteret i verktøyet returnerer ingenting. |
| sende e-post til en fri adresse | Dokumentasjonsforespørsel krever kort og klikk. send_message_to_contact krever at mottaker finnes i organisasjonens kontaktregister. |
| lagre en rutinebeskrivelse | Kortet krever klikk. HTML saniteres med DOMPurify før den vises og lagres. |
| utføre et verktøy som ikke finnes | Dispatcher returnerer «Ukjent verktøy». |
| kalle det samme skrivende verktøyet i løkke | Maks 5 verktøyrunder per forespørsel. |
| gjengi personnummer | Svarfilteret erstatter mønsteret. Verktøyene returnerer ikke feltet. |
| skrive falsk verktøysyntaks i svaret | Strippes før visning. Modellen kan ikke «late som» den har utført noe — bare faktiske verktøyresultater teller. |
Det gjenværende angrepsflaten er handlinger brukeren selv har rett til å utføre, utført på feil objekt fordi modellen misforsto. Det er derfor skriving i Revizo (oppgaver, matching) logges med hvem, hva og når, og kan reverseres på vanlig måte.
Kryss-tenant lekkasje
Primærvern er applikasjonslaget: tenant_id fra sesjon i hver spørring. Dette er samme mekanisme som resten av Revizo, og AI-verktøyene bruker de samme databasehjelperne. Row Level Security i databasen er et sekundært sikkerhetsnett for Supabase Data API, ikke primærvern for applikasjonens egne spørringer. Se Databehandling og lagring → Datasegregering.
Utilsiktet rådgivning
Regnskaps- og skatteråd fra en språkmodell er en faglig og ansvarsmessig risiko. Vi adresserer det i tre lag: instruksen forbyr det, svarfilteret fanger typiske formuleringer og legger til forbehold, og lovoppslag går mot Lovdata med kildehenvisning i stedet for modellens hukommelse. Ingen av lagene er perfekte; brukeren opplyses om at assistenten ikke gir råd.
Kostnadsløp og tilgjengelighet
Månedskvote per organisasjon, hastighetsgrense per bruker, maks 5 verktøyrunder, maks svarlengde og 60 sekunders tidsavbrudd. Modellkall har begrenset antall gjenforsøk ved leverandørfeil. AI-chat er ikke kritisk for Revizo; faller leverandøren ut, fungerer resten av plattformen.
Revisjonsspor
| Hendelse | Logges som | Hvor |
|---|---|---|
| Oppgave opprettet eller endret via assistent | task.created, task.updated | Organisasjonens hendelseslogg |
| Smart Match kjørt via assistent | match.created | Hendelseslogg |
| E-post sendt til kontakt via assistent | agent.message_sent med mottaker | Hendelseslogg |
| Påminnelse opprettet eller slettet | reminder.created, reminder.deleted | Hendelseslogg |
| Eksport generert | export.generated | Hendelseslogg |
| Tripletex-skriving | tripletex.voucher.created, tripletex.invoice.created, tripletex.supplier_invoice.approved | Hendelseslogg |
| Hvert modellkall | Modell, tokens, kategori, bruker, verktøy brukt | ai_usage_log (per tenant) |
| Hver samtale | Meldinger, svar, verktøy brukt, sidekontekst | ai_conversations (per tenant, 90 dager) |
Hendelsesloggen er beskyttet mot endring og sletting på databasenivå. Se Sikkerhetsarkitektur.
Administratorens kontroller
| Kontroll | Hvor | Effekt |
|---|---|---|
| Slå av all AI | Innstillinger → AI & Personvern → hovedbryter | Chat, dokumentanalyse og stemme skjules i UI og avvises på server |
| Slå av bare chat, dokumentanalyse eller stemme | Samme side, individuelle brytere | Bare den funksjonen påvirkes |
| Sette månedskvote | Samme side | Forespørsler over kvoten avvises med 429 |
| Bekreftelsesdialog før avslag | Automatisk | Viser hva som forsvinner og hva som beholdes |
| Rollebegrensning | Brukeradministrasjon | Lesere kan ikke bruke chat |
| Fjerne Lovdata eller kundetiltak | Plan og markedsplass | Tilhørende verktøy fjernes fra katalogen |
Kun administratorer kan endre AI-innstillinger.
Begrensninger vi er åpne om
En sikkerhetsgjennomgang blir ikke bedre av at dokumentasjonen lover mer enn systemet gjør. Følgende er sant i dag:
- Instruksjoner og regex er ikke autorisasjon. Systemprompt og svarfilter reduserer risiko for uønsket innhold, men det er verktøyenes tenant-filter og bekreftelseskortene som er sikkerhetsgrensene. Vi omtaler dem slik.
- To e-postverktøy bekreftes i samtalen, ikke med kort.
send_message_to_contact(mottaker må være registrert kontakt) ogsend_report_email(standard mottaker er brukeren selv). Begge logges. Kort for disse er planlagt. - Regnskapsskriving via Tripletex-verktøyene utføres når brukeren ber om det, uten eget bekreftelseskort. Integrasjonen er valgfri, og handlingene logges.
- Skjermbilder brukeren limer inn sendes til Anthropic som bilde. Brukeren styrer selv hva som limes inn.
- AI-behandling skjer utenfor EØS (Anthropic og OpenAI i USA) under EU standardkontrakter. Organisasjoner som ikke aksepterer det kan slå AI av; resten av Revizo er uberørt.
- Hastighetsgrensen er per bruker, ikke per organisasjon. Månedskvoten er per organisasjon.
- Vi arbeider med én felles policykontroll for alle AI-dataflyter, slik at organisasjonens AI-innstilling håndheves identisk i chat, dokumentanalyse, stemme og bakgrunnsjobber. Chat, dokumentanalyse og stemme er dekket i dag.
Ønsker dere en gjennomgang mot en konkret spørsmålsliste (CAIQ, SIG, egen mal), se Spørsmål og svar for due diligence eller ta kontakt.
Sist oppdatert: september 2026