heygrc
Notatki z praktykithe heygrc team

Jednowierszowy PR, który cicho złamał ISO 27001 A.8.15

Zgodność nie zawodzi podczas audytu. Zawodzi w pięciolinijkowym pull request, który wyglądał na porządkowanie.

Audyt to moment, w którym się dowiadujesz. Pull request to moment, w którym to się stało. Gdzieś między tymi dwoma zdarzeniami, często oddzielonymi o miesiące, przestała działać kontrola, którą audytor sprawdzi, a nikt tego nie zauważył, ponieważ zmiana, która ją złamała, nie wyglądała na zmianę związaną z zgodnością. Wyglądała na porządkowanie.

Oto jej kształt. Kontrola to ISO 27001:2022 A.8.15, rejestrowanie zdarzeń. Zmiana to jedna usunięta linia.

Zmiana

Pull request porządkuje funkcję aktualizującą rolę użytkownika. W środku znajduje się wywołanie logowania, które autor uznał za szum, uruchamia się przy każdej zmianie roli i zaśmieca wyjście, więc zostało usunięte. Funkcja nadal działa. Testy nadal przechodzą. Diff jest o jedną linię krótszy i, jeśli w ogóle, to czystszy.

access/roles.ts+0 -1
async function updateRole(actor, target, role) {  await db.roles.set(target, role)-  await audit.log("role.update", { actor, target, role })  return ok()}
heygrcISO 27001:2022 A.8.15

Ta linia była zapisem audytowym dla zmiany uprawnień dostępu. A.8.15 (rejestrowanie zdarzeń) wymaga, aby istotne zdarzenia bezpieczeństwa, w tym zmiany uprawnień, były rejestrowane i przechowywane, a A.8.16 (monitorowanie) zależy od istnienia tego zapisu. Usunięcie go usuwa jedyny dowód, że rola kiedykolwiek została zmieniona.

Dlaczego nikt tego nie złapał

Recenzent patrząc na ten diff widzi usuniętą linię logowania. Aby złapać problem, musiałby wiedzieć, że ten konkretny log jest dowodem dla kontroli, że kontrola to A.8.15 i że A.8.15 jest w zakresie ich certyfikacji. To trzy elementy wiedzy o frameworku, których recenzent kodu nie ma w głowie podczas zatwierdzania rutynowego refaktoryzacji.

To jest luka. Punkt kontrolny jest we właściwym miejscu, recenzja kodu już sprawdza każdą zmianę, celowo, zanim trafi do produkcji. Brakuje świadomości frameworku, aby rozpoznać, że zwykła linia kodu jest kluczowa dla audytu.

Ile to kosztuje później

Złapane tutaj, to jest cofnięcie jednej linii i trzydziestosekundowa rozmowa. Autor wciąż ma całą zmianę w głowie. Złapane podczas audytu, to jest wyjątek: kontrola nie działała przez cały okres, a teraz ktoś musi odtworzyć, kiedy logowanie zostało przerwane, co od niego zależało i jak bezpiecznie je przywrócić, na czas, być może po odejściu autora.

Koszt luki w zgodności jest określany przez jedną rzecz: jak długo istniała, zanim ktokolwiek ją zauważył. Pull request to najtańsze miejsce, aby ją zauważyć.

Sedno sprawy

Zgodność zawodzi w pięciolinijkowym PR, a nie podczas audytu. Audyt to opóźniony wskaźnik decyzji, którą ktoś podjął w diff kilka tygodni wcześniej. heygrc został stworzony, aby odczytywać ten diff w kontekście frameworków, które musisz spełnić, i identyfikować kontrolę, której dotyczy zmiana, A.8.15, w pull request, gdy naprawa jest jeszcze tania.

iso-27001loggingcode-reviewshift-left