Przepływ informacji (teoria informacji)

informacji w informacji to transfer informacji ze do zmiennej w danym procesie . Nie wszystkie przepływy mogą być pożądane; na przykład system nie powinien ujawniać żadnych poufnych informacji (częściowo lub nie) obserwatorom publicznym, ponieważ stanowi to naruszenie prywatności na poziomie indywidualnym lub może spowodować poważne straty na poziomie korporacyjnym.

Wstęp

Zabezpieczenie danych przetwarzanych przez systemy komputerowe było wyzwaniem w ostatnich latach. Obecnie istnieje kilka metod ograniczania ujawniania informacji, takich jak listy kontroli dostępu , zapory ogniowe i kryptografia . Jednak chociaż te metody nakładają ograniczenia na informacje uwalniane przez system, nie dają gwarancji propagacji informacji . Na przykład listy kontroli dostępu do systemów plików zapobiegają nieautoryzowanemu dostępowi do plików, ale nie kontrolują późniejszego wykorzystania danych. Podobnie kryptografia zapewnia środki do prywatnej wymiany informacji przez niezabezpieczony kanał, ale nie daje się żadnych gwarancji co do poufności danych po ich odszyfrowaniu.

W analizie przepływu informacji niskiego poziomu każdej zmiennej jest zwykle przypisywany poziom bezpieczeństwa. Podstawowy model obejmuje dwa odrębne poziomy: niski i wysoki, oznaczający odpowiednio informacje publicznie obserwowalne i informacje tajne. Aby zapewnić poufność, nie należy zezwalać na przepływ informacji od zmiennych o wysokim do niskiego poziomu. Z drugiej strony, aby zapewnić integralność, przepływy do wysokich zmiennych powinny być ograniczone.

Mówiąc bardziej ogólnie, poziomy bezpieczeństwa można postrzegać jako siatkę , w której informacje przepływają tylko w górę.

Na przykład, biorąc pod uwagę dwa poziomy bezpieczeństwa ( i wysoki), jeśli płynie z do od do do H. byłyby dozwolone, podczas gdy przepływy z do nie.

W całym artykule zastosowano następującą notację:

  • zmienna (niska) oznacza publicznie obserwowalną zmienną l
  • ∈ wysoki) oznacza tajną zmienną

Gdzie i to jedyne dwa poziomy bezpieczeństwa w sieci .

Jawne przepływy i kanały boczne

Przepływy informacji można podzielić na dwie główne kategorie. Najprostszym jest jawny przepływ, w którym pewien sekret jest jawnie ujawniany publicznie obserwowalnej zmiennej. W poniższym przykładzie sekret w zmiennej h wpływa do publicznie obserwowalnej zmiennej l .

 var  l, h l := godz 

Pozostałe przepływy należą do kategorii kanału bocznego . Na przykład w ataku czasowym lub w ataku analizy mocy system przepuszcza informacje odpowiednio przez czas lub moc potrzebną do wykonania działania w zależności od tajnej wartości.

W poniższym przykładzie atakujący może wywnioskować, czy wartość h wynosi jeden, czy nie, zanim program zakończy działanie:

 var  l, h  jeśli  h = 1  to  (* wykonaj trochę czasochłonnej pracy *) l := 0 

Innym bocznym kanałem przepływu jest niejawny przepływ informacji, który polega na wycieku informacji przez przepływ sterowania programem. Poniższy program (niejawnie) ujawnia wartość tajnej zmiennej h zmiennej l . W tym przypadku, ponieważ h jest wartością logiczną, ujawniane są wszystkie bity zmiennej h (na końcu programu l będzie wynosić 3, jeśli h jest prawdziwe, a 42 w przeciwnym przypadku).

 var  l, h  jeśli  h = prawda  to  l := 3  inaczej  l := 42 

Brak zakłóceń

Brak ingerencji to zasada, która wymusza, aby osoba atakująca nie była w stanie odróżnić dwóch obliczeń od ich danych wyjściowych, jeśli różnią się one tylko tajnymi danymi wejściowymi. Jednak ta polityka jest zbyt surowa, aby można ją było zastosować w realistycznych programach. Klasycznym przykładem jest program do sprawdzania haseł, który, aby był użyteczny, musi ujawnić pewne tajne informacje: czy wprowadzone hasło jest poprawne, czy nie (należy pamiętać, że informacja, którą uzyskuje osoba atakująca w przypadku odrzucenia hasła przez program, jest taka , że podane hasło jest nieprawidłowe ).

Kontrola przepływu informacji

Mechanizm kontroli przepływu informacji to taki, który wymusza zasady przepływu informacji. Zaproponowano kilka metod egzekwowania zasad przepływu informacji. Mechanizmy czasu wykonywania, które oznaczają dane etykietami przepływu informacji, zostały zastosowane na poziomie systemu operacyjnego i na poziomie języka programowania. Opracowano również statyczne analizy programów, które zapewniają zgodność przepływu informacji w ramach programów z polityką.

Opracowano zarówno analizę statyczną, jak i dynamiczną dla obecnych języków programowania. Jednak techniki analizy dynamicznej nie mogą obserwować wszystkich ścieżek wykonania, a zatem nie mogą być zarówno solidne, jak i precyzyjne. Aby zagwarantować brak ingerencji, albo przerywają wykonywanie, które może ujawnić poufne informacje, albo ignorują aktualizacje, które mogą spowodować wyciek informacji.

Wybitnym sposobem egzekwowania zasad przepływu informacji w programie jest system typów zabezpieczeń: to znaczy system typów, który wymusza właściwości zabezpieczeń. W takim systemie typu dźwiękowego, jeśli program sprawdza typ, spełnia politykę przepływu i dlatego nie zawiera niewłaściwych przepływów informacji.

System typu bezpieczeństwa

W języku programowania rozszerzonym o system typów zabezpieczeń każde wyrażenie zawiera zarówno typ (taki jak logiczny lub całkowity), jak i etykietę bezpieczeństwa.

Poniżej znajduje się prosty system typu bezpieczeństwa, który wymusza brak ingerencji. Notacja że ​​wyrażenie ma typ . Podobnie, oznacza, że ​​polecenie wpisać w kontekście bezpieczeństwa .

Dobrze wpisane polecenia to np.

.

Program odwrotnie

, ponieważ ujawni wartość do

, że reguła jest regułą że ​​​​każde polecenie typu bezpieczeństwa być również . Na przykład może być zarówno , jak i . Nazywa się to polimorfizmem w teorii typów . Podobnie, typ wyrażenia , które spełnia zarówno i _ i odpowiednio.

Odtajnienie

Jak pokazano wcześniej, polityka nieingerencji jest zbyt restrykcyjna, aby można ją było stosować w większości rzeczywistych aplikacji. Dlatego opracowano kilka podejść umożliwiających kontrolowane uwalnianie informacji. Takie podejście nazywane jest odtajnieniem informacji.

Solidne odtajnienie wymaga, aby aktywny atakujący nie mógł manipulować systemem w celu poznania większej liczby sekretów niż te, które już znają pasywni atakujący.

Konstrukcje odtajniania informacji można sklasyfikować według czterech ortogonalnych wymiarów: jakie informacje są udostępniane, kto jest upoważniony do dostępu do informacji, gdzie informacje są udostępniane i kiedy informacje są udostępniane.

Co

Jaka polityka odtajniania kontroluje, które informacje (częściowe lub nie) mogą zostać ujawnione publicznie obserwowalnej zmiennej.

Poniższy przykład kodu pokazuje konstrukcję declassify from. W tym kodzie programista wyraźnie zezwala wartości zmiennej h na przepływ do publicznie obserwowalnej zmiennej l .

 var  l, h  jeśli  l = 1  to  l :=  odtajnij  (h) 

Kto

kto kontroluje, którzy zleceniodawca (tj. kto) może uzyskać dostęp do danej informacji. Tego rodzaju polityka została zaimplementowana w kompilatorze Jif.

Poniższy przykład pozwala Bobowi podzielić się z Alicją swoim sekretem zawartym w zmiennej b za pośrednictwem powszechnie dostępnej zmiennej ab .


 var  ab  (* {Alicja, Bob} *)  var  b  (* {Bob} *)  jeśli  ab = 1  , to  ab :=  odtajnij  (b, {Alicja, Bob})  (* {Alicja, Bob} *) 

Gdzie

Polityka odtajniania gdzie określa, gdzie informacje mogą być udostępniane, na przykład poprzez kontrolowanie, w których wierszach kodu źródłowego mogą być udostępniane informacje.

Poniższy przykład wykorzystuje konstrukcję przepływu zaproponowaną w. Ta konstrukcja przyjmuje politykę przepływu (w tym przypadku zmienne w H mogą przepływać do zmiennych w L) oraz polecenie, które jest uruchamiane zgodnie z daną polityką przepływu.

 var  l, h  przepływ  H.  L  w  l: = godz 

Gdy

Zasady dotyczące odtajniania określają, kiedy informacje mogą zostać ujawnione. Polityki tego rodzaju mogą służyć do weryfikacji programów realizujących np. kontrolowane uwalnianie tajnych informacji po dokonaniu płatności lub zaszyfrowanych tajemnic, które nie powinny zostać ujawnione w określonym czasie przy wielomianowej mocy obliczeniowej.

Podejścia odtajniające dla przepływów niejawnych

Przepływ niejawny występuje, gdy kod, którego warunkowe wykonanie jest oparte na informacjach prywatnych, aktualizuje zmienną publiczną. Jest to szczególnie problematyczne, gdy bierze się pod uwagę wiele wykonań, ponieważ osoba atakująca może wykorzystać zmienną publiczną do wywnioskowania prywatnych informacji, obserwując, jak jej wartość zmienia się w czasie lub wraz z danymi wejściowymi.

Naiwne podejście

Podejście naiwne polega na wymuszaniu własności poufności na wszystkich zmiennych, na których wartość mają wpływ inne zmienne. Ta metoda prowadzi do częściowego wycieku informacji, ponieważ w niektórych instancjach aplikacji zmienna jest niska, aw innych wysoka.

Brak wrażliwej aktualizacji

Żadna wrażliwa aktualizacja nie zatrzymuje programu, gdy zmienna High wpływa na wartość zmiennej Low, skutecznie zapobiegając wyciekowi informacji. Ponieważ po prostu szuka wyrażeń, w których może dojść do wycieku informacji bez patrzenia na kontekst, może zatrzymać program, który pomimo potencjalnego wycieku informacji nigdy tak naprawdę nie powoduje wycieku informacji.

W poniższym przykładzie x jest wysokie, a y jest niskie.

 var  x, y y := fałsz  jeśli  x = prawda  to  y := prawda  zwróć  prawdę 

W takim przypadku program zostałby zatrzymany, ponieważ używa wartości zmiennej High do zmiany zmiennej Low, mimo że program nigdy nie przepuszcza informacji.

Dozwolone uaktualnienie

Permissive-upgrade wprowadza dodatkową klasę bezpieczeństwa P, która będzie identyfikować zmienne powodujące wyciek informacji. Kiedy zmienna High wpływa na wartość zmiennej Low, ta ostatnia jest oznaczona P. Jeśli zmienna oznaczona P wpływa na zmienną Low, program zostanie zatrzymany. Aby zapobiec zatrzymaniu, zmienne Low i P powinny zostać przekonwertowane na High przy użyciu funkcji prywatyzacji, aby zapewnić, że nie dojdzie do wycieku informacji. W kolejnych instancjach program będzie działał bez przerwy.

Wnioskowanie o prywatyzacji

Wnioskowanie o prywatyzacji rozszerza zezwolenie na aktualizację, aby automatycznie zastosować funkcję prywatyzacji do dowolnej zmiennej, która może spowodować wyciek informacji. Ta metoda powinna być używana podczas testowania, gdzie przekonwertuje większość zmiennych. Gdy program przejdzie do produkcji, należy użyć permissive-upgrade, aby zatrzymać program w przypadku wycieku informacji, a funkcje prywatyzacyjne można zaktualizować, aby zapobiec kolejnym wyciekom.

Zastosowanie w systemach komputerowych

Oprócz zastosowań w języku programowania, teorie kontroli przepływu informacji zostały zastosowane w systemach operacyjnych, systemach rozproszonych i przetwarzaniu w chmurze.