Jednostka 11 / 12

Weryfikacja kodu, luki w zabezpieczeniach i ryzyko związane z wynikami AI

Zyski:

  • Możliwość weryfikacji wyników AI na trzech poziomach: dokładności, bezpieczeństwa i źródła/licencji
  • Możliwość zabezpieczenia zagrożeń takich jak zastrzyki, pakiety halucynacyjne i zakopane tajemnice za pomocą bezpiecznych form i narzędzi
  • Umiejętność przedstawienia kodu krytycznego dla bezpieczeństwa do zatwierdzenia przez kompetentnego inżyniera i zrozumienia braku możliwości przeniesienia odpowiedzialności

Generowanie kodu AI jest łatwe; Zaufanie mu jest kosztowne. Jedynym celem tej jednostki jest przekształcenie zasady „weryfikacji”, którą powtarzaliśmy we wszystkich poprzednich jednostkach, w systematyczną dyscyplinę inżynierską. Ponieważ kod stworzony przez sztuczną inteligencję, nawet jeśli na pierwszy rzut oka wydaje się poprawny, niesie ze sobą trzy różne zagrożenia: niedziałający/nieprawidłowy (halucynacje), brak bezpieczeństwa (luka w zabezpieczeniach) oraz ryzyko prawne/licencyjne. Znajomość tych trzech i stworzenie drzwi dla każdego z nich czyni Cię profesjonalistą.

Tutaj rozważamy „walidację” na trzech poziomach: poprawność (czy kod faktycznie spełnia swoje zadanie?), bezpieczeństwo (czy jest odporny na złośliwe działanie?) i pochodzenie/licencję (czy mam prawo używać tego kodu?). Każda warstwa ma swoje własne środki kontroli i żadnego z nich nie można ominąć „tak powiedziała sztuczna inteligencja”.

Trzy warstwy ryzyka

1. Ryzyko dokładności (halucynacje). Model może wywołać nieistniejącą funkcję, niewłaściwie użyć API, po cichu ominąć przypadek Edge. Kod wygląda „rozsądnie”, ale jest błędny. Antidotum: kompilacja, testowanie, analiza statyczna i kontrola wizualna.

2. Ryzyko bezpieczeństwa. Sztuczna inteligencja może powtarzać niebezpieczne wzorce w danych szkoleniowych: zapytania podatne na wstrzyknięcie SQL, nieuwierzytelnione dane wejściowe użytkownika, słabe szyfrowanie, niepewna deserializacja, otwarte przekierowanie. Kod działa, ale jest podatny na ataki. Antidotum: przegląd skupiony na bezpieczeństwie, automatyczne skanery (SAST) i narzucanie znanych wzorców bezpieczeństwa.

3. Ryzyko źródła/licencji. Sztuczna inteligencja może generować dane wyjściowe bardzo przypominające kod chroniony prawem autorskim lub restrykcyjnie licencjonowany, albo może sugerować niewłaściwie licencjonowaną zależność. Antidotum: sprawdzanie zależności i licencji, sprawdzanie oryginalności, polityka korporacyjna.

Uwaga: najbardziej podstępnym z tych trzech zagrożeń jest bezpieczeństwo; ponieważ kod może przejść testy, działać bezproblemowo w środowisku produkcyjnym, a luka zostaje ujawniona dopiero wtedy, gdy osoba atakująca ją znajdzie. „Praca” to nie to samo, co „bezpieczny”.

Krok po kroku: Warstwowa bramka uwierzytelniająca

  1. Czytaj ze zrozumieniem. Naprawdę zrozum kod przed jego zaakceptowaniem; Nie łącz kodu, którego nie rozumiesz. Jeśli nie potrafisz wyjaśnić, „dlaczego to działa”, oznacza to, że nie zostało to jeszcze sprawdzone.
  2. Sprawdź, czy istnieje. Potwierdź, że każda używana funkcja, API i pakiet rzeczywiście istnieje i jest używana poprawnie (bramka halucynacyjna).
  3. Uruchom zautomatyzowane narzędzia. Kompilator, linter (skaner stylów/błędów), sprawdzanie typów, testy jednostkowe i, jeśli to możliwe, SAST (statyczne testowanie bezpieczeństwa aplikacji — narzędzie skanujące kod źródłowy pod kątem luk).
  4. Spójrz na to z punktu widzenia bezpieczeństwa. Czy dane wejściowe zostały zatwierdzone? Czy zapytanie jest sparametryzowane? Czy tajemnica została pogrzebana? Czy istnieje kontrola autoryzacji?
  5. Sprawdź źródło i licencję. Czy nowe zależności są objęte licencją? Czy dane wyjściowe wyglądają zbyt podobnie do znanej bazy kodu?
  6. Jeśli ma to kluczowe znaczenie dla bezpieczeństwa, poproś o zgodę eksperta. Niezależna recenzja dokonana przez inżyniera kompetentnego w takich obszarach jak uwierzytelnianie, płatności, kryptografia, kontrola dostępu jest obowiązkowa.

Trzy mini etui

Przypadek 1 — Wstrzyknięcie SQL złapane na bramce inspekcyjnej. Kod wygenerowany przez sztuczną inteligencję, który łączy dane wprowadzone przez użytkownika bezpośrednio z zapytaniem SQL dotyczącym punktu końcowego wyszukiwania („... WHERE nazwa = '” + q + „'”). Kod zadziałał i przeszedł test. Wykryły to inspekcja skupiona na bezpieczeństwie i skanowanie SAST; Zostało ono przekształcone w zapytanie sparametryzowane (przygotowane zestawienie). Gdyby nie została wykryta, byłaby to klasyczna luka w zabezpieczeniach umożliwiająca wyciek danych.

Przypadek 2 — Pakiet halucynacyjny. Sztuczna inteligencja zasugerowała dla zadania nieistniejący pakiet npm (fast-safe-parse). Gdy programista próbował go zainstalować, pakiet nie został znaleziony. Co gorsza: w niektórych przypadkach atakujący mogą wypełnić takie „duchowe” nazwy pakietów prawdziwymi, złośliwymi pakietami (pomieszanie zależności). Lekcja: sprawdź każdy zalecany pakiet pod kątem oficjalnego rejestru i historii pobierania/konserwacji.

Przypadek 3 — Niezgodność licencji. Sprytna biblioteka towarzysząca zaproponowana przez sztuczną inteligencję miała silną licencję typu copyleft, która była niezgodna z licencją produktu instytucji. Zgłoszono to podczas skanowania licencji zależności; Zespół wymienił licencję na odpowiednią alternatywę. Bez weryfikacji powstałyby obciążenia prawne w dystrybucji produktów.

Cztery szablony do kopiowania

Samokontrola przed przyjęciem:

Zanim zaakceptujesz następujący kod wygenerowany przez AI, sprawdź: 1) Czy każda funkcja/API/pakiet, którego używa, rzeczywiście istnieje? Oznacz podejrzanych.2) Czy istnieją jakieś niezweryfikowane dane wejściowe, konkatenacja SQL/poleceń, ukryty sekret, słabe szyfrowanie?3) Jakie są nierozwiązane błędy/przypadki skrajne? Oznacz każde znalezisko jako „pewne/prawdopodobne” i zasugeruj poprawki.{{code}}

Przegląd skupiający się na bezpieczeństwie:

Sprawdź ten kod pod kątem bezpieczeństwa. Poszukaj typowych luk w zabezpieczeniach OWASP: wstrzykiwanie, zepsute uwierzytelnianie/autoryzacja, ujawnianie wrażliwych danych, niepewna deserializacja, nieuwierzytelnione przekierowanie. Dla każdego ustalenia: ryzyko, scenariusz eksploatacji, środki zaradcze. To wstępny przegląd; kieruj krytyczne ustalenia do przeglądu bezpieczeństwa personelu.{{code}}

Sprawdzanie zależności i licencji:

Lista zależności dodanych/sugerowanych przez ten kod. Dla każdego: czy pakiet faktycznie istnieje, czy jest utrzymywany, jaka byłaby jego typowa licencja (MUSI BYĆ WERYFIKOWANA) i czy faktycznie jest potrzebna do projektu, czy też można to zrobić za pomocą istniejącego narzędzia?{{lista kodów lub zależności}}

Bezpieczne osadzanie szalunków (w produkcji):

Napisz kod dla {{task}}. OBOWIĄZKOWE zasady bezpieczeństwa: - Sprawdź/oczyść wszystkie zewnętrzne dane wejściowe. - Używaj wyłącznie sparametryzowanych zapytań w dostępie do bazy danych. - Nie osadzaj sekretów w kodzie; załóż menedżera zmiennych środowiskowych/tajnych - Nie połykaj błędów; Rozważ to sensownie. Wyjaśnij w 3 punktach, w jaki sposób kod jest zgodny z tymi zasadami.

Słaba zachęta/silna zachęta

Słabe: „Napisz zapytanie wyszukujące według nazwy użytkownika”. (Może wystąpić kod podatny na wstrzyknięcie.)
Mocne: „Napisz funkcję wyszukującą według nazwy użytkownika. Nigdy nie dołączaj danych wejściowych użytkownika do zapytania jako ciągu znaków; użyj zapytania sparametryzowanego (przygotowanej instrukcji). Sprawdź wprowadzone dane pod kątem długości i znaku. Wyjaśnij w 2 zdaniach, dlaczego kod jest zamknięty na wstrzyknięcie.

Wersja silna od początku narzuca bezpieczny wzór; W ten sposób zapewnia, że ​​luka w ogóle nie wystąpi, zamiast ją później wychwycić. Niezbędne jest jednak przepuszczenie wygenerowanego kodu przez bramki weryfikacyjne.

Warstwa uwierzytelniania

Narzędzie/metoda

Czy „AI powiedziała” wystarczy?

dokładność

Kompilacja, testowanie, kontrola wizualna

nie

Rzeczywistość API/pakietu

Oficjalna kontrola dokumentów/zapisów

nie

Bezpieczeństwo

SAST, przegląd bezpieczeństwa

nie

Licencja/źródło

Sprawdzanie zależności i licencji

nie

Logika krytyczna dla bezpieczeństwa

Zatwierdzenie eksperta inżyniera

Absolutnie nie

Odpowiedzialność nie może zostać przeniesiona

Odpowiedzialność za błędy, luki lub naruszenia wynikające z kodu utworzonego przez narzędzie AI ponosi zespół, który montuje i dystrybuuje ten kod, a nie dostawca narzędzia. Jest to fakt zarówno zawodowy, jak i prawny: podpisujesz. Zatem stwierdzenie „wyprodukowała to sztuczna inteligencja” nie jest wymówką, ale uzasadnieniem zachowania szczególnej ostrożności. Szczególnie w systemach o krytycznym znaczeniu dla bezpieczeństwa, wyjście AI w żadnym wypadku nie zastępuje przeglądu i zatwierdzenia przez wykwalifikowanego inżyniera; Co najwyżej sztuczna inteligencja zapewnia plan, który przyspiesza tego inżyniera.

Wskazówka: utwórz w swoim zespole krótką listę kontrolną, którą nazwiesz „bramką walidacyjną dla kodu wygenerowanego przez sztuczną inteligencję” (kompilacja + test + skanowanie bezpieczeństwa + kontrola wizualna). Gdy korzystanie z tej bramki stanie się nawykiem, utrata prędkości będzie minimalna, a redukcja ryzyka maksymalna.

Typowe błędy

  • Mylenie „działa” z „bezpiecznym”. Kod, który przejdzie testy, może być podatny na atak.
  • Korzystanie z pakietu/API bez jego weryfikacji. Pakiety halucynacyjne zarówno uszkadzają, jak i stanowią zagrożenie dla bezpieczeństwa.
  • Omijanie zautomatyzowanych narzędzi. Linter, sprawdzanie typu i SAST tanio wyłapują to, czego brakuje ludziom.
  • Ignorowanie licencji. Niewłaściwa zależność licencjonowana stwarza obciążenie prawne w zakresie dystrybucji.
  • Przerzucanie odpowiedzialności na pojazd. Zespół jest odpowiedzialny za kod w fazie produkcyjnej; „AI to zrobiła” nie jest wymówką.

Podsumowując

Akceptowanie wyników AI wymaga trzech warstw weryfikacji: poprawności (kompilacja, testowanie, kontrola wizualna), bezpieczeństwa (SAST i przegląd skupiony na bezpieczeństwie) oraz źródła/licencji (sprawdzanie zależności). Potwierdź, że każdy używany pakiet i interfejs API rzeczywiście istnieje, od początku egzekwuj bezpieczne wzorce i prześlij kod krytyczny dla bezpieczeństwa do zatwierdzenia przez wykwalifikowanego inżyniera. „Działa” nie oznacza bezpiecznie, a „wyprodukowano sztuczną inteligencję” nie zwalnia z odpowiedzialności. Bramka weryfikacyjna jest ceną profesjonalizmu, a nie szybkości.

Zadanie aplikacji

Celowo przydziel sztucznej inteligencji zadanie wrażliwe na bezpieczeństwo (np. „funkcję przeszukującą bazę danych za pomocą danych wprowadzonych przez użytkownika”), tym razem bez narzucania bezpiecznego wzorca. Przepuszczaj przychodzący kod przez szablony „samokontroli przed przyjęciem” i „przeglądu skupionego na bezpieczeństwie”: czy jest tam jakiś zastrzyk, ukryty sekret, halucynacyjny pakiet lub nieuwierzytelnione dane wejściowe? Następnie zadaj to samo zadanie ponownie, korzystając z szablonu „bezpiecznego narzucania wzorców” i porównaj oba wyniki. Jeśli to możliwe, uruchom narzędzie linter/SAST i porównaj wyniki z samoregulacją sztucznej inteligencji.

lista kontrolna

  • [ ] Sprawdzam wyniki AI na trzech poziomach: dokładność, bezpieczeństwo i licencja.
  • [ ] Potwierdzam, że każda użyta funkcja, API i pakiet faktycznie istnieje.
  • [ ] Uruchamiam narzędzia do kompilacji, testowania, linterowania i, jeśli to możliwe, narzędzi SAST.
  • [ ] Od początku narzucam bezpieczne wzorce (zapytania sparametryzowane, sprawdzanie poprawności danych wejściowych, zarządzanie sekretami).
  • [ ] Sprawdzam licencjonowanie i wymagania nowych zależności.
  • [ ] Przesyłam do zatwierdzenia przez kompetentnego inżyniera kod krytyczny dla bezpieczeństwa i rozumiem, że ponoszę za to odpowiedzialność.