Weryfikacja Bajtkodu Javy

Podobne dokumenty
Dziedziczenie. dr Jarosław Skaruz

PROGRAMOWANIE DYNAMICZNE

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wykład 4: Klasy i Metody

Kurs WWW. Paweł Rajba.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Enkapsulacja, dziedziczenie, polimorfizm

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Java Język programowania

KLASY, INTERFEJSY, ITP

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

1. Język JAVA. 1. Pierwszy program. 2. Kalkulator. 3. Klasy. 4. Dziedziczenie

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Interfejsy i klasy wewnętrzne

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wykład 8: klasy cz. 4

Dziedziczenie. Tomasz Borzyszkowski

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Typy sparametryzowane

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie obiektowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie w Internecie. Java

Metody Realizacji Języków Programowania

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie obiektowe - 1.

Wykład 6: Dziedziczenie

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Specyfikacje w praktyce na przykładzie JML-a. Sesja I

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Oracle PL/SQL. Paweł Rajba.

Definiowanie własnych klas

UML a kod. C++, Java i C#

Platformy Programistyczne Podstawy języka Java

Dokumentacja do API Javy.

Programowanie obiektowe

Multimedia JAVA. Historia

Wykład 5: Więcej o Klasach i Metodach

JAVA W SUPER EXPRESOWEJ PIGUŁCE

E S - uniwersum struktury stosu

Programowanie obiektowe

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

PyPy's Approach to Virtual Machine Construction

Wstęp do programowania obiektowego, wykład 7

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

.NET Klasy, obiekty. ciąg dalszy

Programowanie obiektowe

Programowanie Obiektowe i C++

Dawid Gierszewski Adam Hanasko

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Programowanie obiektowe

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Lab 9 Podstawy Programowania

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

Podstawowe części projektu w Javie

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Informatyka I. Wykład 4. Tablice. Dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

Metody sparametryzowane

Programowanie obiektowe

Programowanie obiektowe

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Tabela wewnętrzna - definicja

Ada-95. Dariusz Wawrzyniak

Mechanizm dziedziczenia

Programowanie obiektowe

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

TEMAT : KLASY DZIEDZICZENIE

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Wykład 2: Podstawy Języka

Szablony klas, zastosowanie szablonów w programach

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Zaawansowane programowanie w języku C++ Klasy w C++

Zaawansowane programowanie w C++ (PCP)

Język C++ Programowanie obiektowe

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Wstęp do programowania 2

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Co jeszcze mogą nam dać adnotacje? Adam Warski

Model pamięci. Rafał Skinderowicz

Aplikacje w środowisku Java

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

Definicje klas i obiektów. Tomasz Borzyszkowski

Transkrypt:

Weryfikacja Bajtkodu Javy Patryk Czarnik Wydział Matematyki, Informatyki i Mechaniki UW 11 grudnia 2007

Co teraz? Weryfikacja bajtkodu 1 Weryfikacja bajtkodu Zapewniane własności Standardowy algorytm weryfikacji Słabości oryginalnej specyfikacji Formalizacje 2 Bytecode proofing Idea Algorytm 3 Co można zdziałać? Formalizacja i wykorzystanie własności Formalizacja algorytmu Bytecode proofing Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 2 / 33

Weryfikacja bajtkodu Zapewniane własności Weryfikacja bajtkodu w specyfikacji JVM 4.8 Constraints on Java Virtual Machine Code 4.8.1 Static Constraints 4.8.2 Structural Constraints 4.9 Verification of class Files 4.9.1 The Verification Process 4.9.2 The Bytecode Verifier 4.9.3 Values of Types long and double 4.9.4 Instance Initialization Methods and Newly Created Objects 4.9.5 Exception Handlers 4.9.6 Exceptions and finally Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 3 / 33

Weryfikacja bajtkodu Zapewniane własności Własności statyczne (1) Idea Własności bloku kodu i każdej instrukcji lokalnie. Rozmiar tablicy kodu (>0, <65536) Poprawny format instrukcji Cele skoków poczatki instrukcji Argumenty ldc, odwołania do pól i metod zgodne typowo wpisy w tablicy stałych (constant-pool) Operacje na rejestrze nie wychodza poza rejestr Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 4 / 33

Weryfikacja bajtkodu Własności statyczne (2) Zapewniane własności Wywołania metod: konstruktory tylko przez invokespecial metoda <clinit> nigdzie nie wołana jawnie Instrukcja new: odwołanie do pola constant-poolreprezentujacego klasę (nie tablicę) klasa nie abstrakcyjna Instrukcje newarray, anewarray, multianewarray: nie więcej niż 255 wymiarów newarray nie do referencji multianewarray nie więcej wymiarów niż opisuje typ Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 5 / 33

Weryfikacja bajtkodu Zapewniane własności Własności strukturalne (1) Idea Zależności między instrukcjami. Mowa o wykonaniu programu. Instrukcja wywoływana tylko z odpowiednimi parametrami: na stosie lokalnym w rejestrze Dla danej pozycji programu jednakowa głębokość stosu lokalnego niezależnie od przebytej ścieżki Nierozdzielne pary w long i double Lokalny stos ograniczony, brak pobierania z pustego Dostęp do pól i elementów tablic przypisaniowa zgodność typów athrow rzuca Throwable Sterowanie nie wychodzi poza blok kodu. Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 6 / 33

Weryfikacja bajtkodu Własności strukturalne (2) Zapewniane własności Wywołania metod: invokespecial do konstruktorów, metod w bieżacej klasie lub nadklasie konstruktor wywołany na obiekcie niezainicjowanym, odpowiedni stan stosu argumenty o zgodnych typach _return typ zgodny z zadeklarowanym Wywołania zwykłych metod i dostęp do pól tylko na zainicjowanych obiektach Coś z protected... Brak niezainicjowanych obiektów: podczas skoku wstecz w rejestrze wewnatrz kodu z zadeklarowana obsługa wyjatku Konstruktor musi wołać konstruktor z tej samej lub nadklasy (z wyjatkiem klasy Object) Obsługa subroutines typ returnaddress, instrukcje jsr i ret Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 7 / 33

Weryfikacja bajtkodu Standardowy algorytm weryfikacji Standardowy algorytm weryfikacji Opisany po angielsku w Specyfikacji JVM Zaimplementowany w Sunowskich JRE Fazy: 1 ogólny format pliku class (magic number, atrybuty) 2 analiza pliku class, ale nie kodu metod 3 analiza kodu metod (w tym analiza przepływu danych) 4 weryfikacja podczas wykonania (m.in. własności wymagajace dostępu do innych klas) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 8 / 33

Faza 2 Weryfikacja bajtkodu Standardowy algorytm weryfikacji Analiza hierarchii klas: klasy i metody final nie sa nadpisywane każda klasa (poza Object) ma nadklasę Analiza constant-pool: tylko format Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 9 / 33

Faza 3 Weryfikacja bajtkodu Standardowy algorytm weryfikacji Dla każdej metody (osobno): 1 Podział kodu na instrukcje 2 Sprawdzenie instrukcji i parametrów cele skoków (i ostatnia instrukcja) granice bloków chronionych obsługa wyjatku poczatki kodu obsługi wyjatków indeksy zmiennych referencje do constant-pool 3 Analiza przepływu danych (DFA) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 10 / 33

Weryfikacja bajtkodu Standardowy algorytm weryfikacji DFA struktury Struktury danych Dla każdej instrukcji instrukcja typy stosu i rejestru bit zmieniony Inicjalizacja Dla pierwszej instrukcji: pusty stos, typy rejestru z sygnatury metody (parametry) zmieniony = 1 Dla pozostałych instruckji: typ stosu i rejestrów nieustalony zmieniony = 0 Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 11 / 33

Weryfikacja bajtkodu Standardowy algorytm weryfikacji DFA struktury Struktury danych Dla każdej instrukcji instrukcja typy stosu i rejestru bit zmieniony Inicjalizacja Dla pierwszej instrukcji: pusty stos, typy rejestru z sygnatury metody (parametry) zmieniony = 1 Dla pozostałych instruckji: typ stosu i rejestrów nieustalony zmieniony = 0 Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 11 / 33

DFA w pętli Weryfikacja bajtkodu Standardowy algorytm weryfikacji 1 Weź instrukcję, dla której zmieniony = 1 brak sukces weryfikacji 2 zmieniony := 0 3 Sprawdź istnienie i typy argumentów instrukcji niezgodności porażka weryfikacji 4 Zamodeluj zmiany powodowane przez instrukcję brak miejsca na stosie porażka weryfikacji 5 Dla każdej możliwej następnej instrukcji (uwzględniajac następna, cele skoków i obsługę wyjatków) złacz (merge) stan po instrukcji ze stanem przy docelowej instrukcji (dla wyjatków z czyszczeniem stosu) zmieniony := 1 Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 12 / 33

Weryfikacja bajtkodu DFA złaczanie stanów Standardowy algorytm weryfikacji Jeden ze stanów nieokreślony wstawiamy drugi Rozmiar stosu musi się zgadzać Złaczanie pojedynczych typów na stosie: różne rodzaje porażka weryfikacji dwie referencje wstawiany kres górny (?) Złaczanie pojedynczych typów w tablicy: różne rodzaje wpisany typ NIE WOLNO CZYTAĆ! dwie referencje wstawiany kres górny Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 13 / 33

Weryfikacja bajtkodu Standardowy algorytm weryfikacji DFA dodatkowe trudności Typy long i double: operacje na parach komórek z zachowaniem kolejności Tworzenie obiektów i konstruktory: oznaczanie faktu trwania inicjalizacji specjalny typ Obsługa finally (subroutines) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 14 / 33

Weryfikacja bajtkodu Słabości oryginalnej specyfikacji Problemy z oryginalna specyfikacja Subroutines trudne, a mało przydatne Niekonsekwencje w opisie: sprawdzenia podobnego rodzaju: niektóre podczas weryfikacji, inne podczas wykonania sprzeczność w opisie dostępu do niezainicjowanych obiektów Własności strukturalne: własność o dobrym typie argumentów, doprecyzowana potem dla różnych (ale nie wszystkich) instrukcji Własności niepotrzebnie strukturalne: zgodność typu _return z sygnatura metody, nie wychodzenie poza koniec kodu Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 15 / 33

Weryfikacja bajtkodu Słabości oryginalnej specyfikacji Problemy z oryginalna specyfikacja Własności bez wpływu na bezpieczeństwo typowe: rozmiar stosu niezależny od ścieżki brak niezainicjowanych obiektów przy skoku wstecz brak rekursji itp. dla subroutines invokespecial nie do zwykłych metod Relacje między typami referencji problem z wersja klasy i class loaders kres górny dla interfejsów (wielodziedziczenie) standardowy algorytm bierze Object Obsługa inicjalizacji obiektu (działa, ale nieelegancka) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 16 / 33

Weryfikacja bajtkodu Formalizacje Formalizacje z dodatkowymi pomysłami Zbiory zamiast pojedynczych typów referencji: Allen Goldberg, Zhenyu Quian (niezależnie) istnieje kres górny (zbiór), nie trzeba brać Object Lekka weryfikacja (Rose&Rose, JavaCard, KVM): pełna weryfikacja off-device zapisane wyliczone informacje o typie w miejscach łaczenia sterowania jednoprzebiegowa weryfikacja on-device Wielowariantowa weryfikacja (chyba X.Leroy): pozwala na więcej w przypadku subroutines każde wejście do subroutines weryfikowane niezależnie możliwa rekurencja Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 17 / 33

Duże formalizacje Weryfikacja bajtkodu Formalizacje G.Klein&T.Nipkow(&M.Wildmoser) formalizacja w HOL/Isabelle lekka weryfikacja język µjava subroutines i inicjalizacja obiektów S.Freund&J.Mitchell system typów (chyba tylko na papierze) wybrany reprezentatywny podzbiór instrukcji subroutines i inicjalizacja obiektów Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 18 / 33

Co teraz? Bytecode proofing 1 Weryfikacja bajtkodu Zapewniane własności Standardowy algorytm weryfikacji Słabości oryginalnej specyfikacji Formalizacje 2 Bytecode proofing Idea Algorytm 3 Co można zdziałać? Formalizacja i wykorzystanie własności Formalizacja algorytmu Bytecode proofing Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 19 / 33

Bytecode proofing Idea Bytecode proofing idea Andreas Gal(i Chrisian W. Probst, i Michael Franz) Information and Computer Science, University of California, Irvine Motywacja: kwadratowy pesymistyczny koszt standardowego algorytmu weryfikacji możliwość ataku DoS Idea przekształcenie programu wejście wyjście semantyka poprawne poprawne zgodna niepoprawne poprawne nieokreślona niepoprawne brak N/D Koszt liniowy Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 20 / 33

Bytecode proofing Algorytm Fazy algorytmu Bytecode proofing 1 Odtworzenie grafu przepływu sterowania 2 Przekształcenie do postaci rejestrowej 3 Przekształcenie do postaci SSA 4 DFA (tanie dzięki SSA) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 21 / 33

Bytecode proofing Algorytm Odtworzenie grafu przepływu sterowania Podział programu na bloki zwn skoki każdy potencjalny cel skoku poczatkiem bloku każdy potencjalny poczatek skoku końcem bloku komplikacje w przypadku subroutines Możliwe przepływy sterowania krawędziami grafu Pozwala przechowywać dodatkowe struktury i analizować złaczenia tylko w istotnych punktach Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 22 / 33

Bytecode proofing Algorytm Przekształcenie do postaci rejestrowej 1 DFA z jednym typem dla referencji (liniowe) 2 Podział rejestru na części zwn na typ: rozmnożenie rejestru dla każdego z typów bazowych instrukcje używaja swojej części rejestru 3 Przechowywanie elementów stosu w rejestrze: dodatkowe pozycje rejestru każda instrukcja na stosie obudowana load i store między takimi blokami pusty stos Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 23 / 33

Bytecode proofing Algorytm SSA Single Static Assignment Każda zmienna przypisywana dokładnie raz Sprawdzany brak odczytu przed przypisaniem Kolejny raz rozmnożenie zmiennych Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 24 / 33

Co teraz? Co można zdziałać? 1 Weryfikacja bajtkodu Zapewniane własności Standardowy algorytm weryfikacji Słabości oryginalnej specyfikacji Formalizacje 2 Bytecode proofing Idea Algorytm 3 Co można zdziałać? Formalizacja i wykorzystanie własności Formalizacja algorytmu Bytecode proofing Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 25 / 33

Co można zdziałać? Formalizacja i wykorzystanie własności Formalizacja własności idea Formalizacja własności statycznych i strukturalnych W dowodach działania programu założenie, że zachodza Prawdopodobnie do dowiedzenia: zweryfikowany program się nie zacina Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 26 / 33

Co można zdziałać? Formalizacja i wykorzystanie własności Formalizacja własności status Wiele własności wynika z formalizacji Bicolano Moja formalizacja własności statycznych Moja formalizacja własności strukturalnych: typy argumentów instrukcji rozmiar stosu (ograniczony, niezależny od ścieżki) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 27 / 33

Co można zdziałać? Formalizacja i wykorzystanie własności Formalizacja własności nie zrobione Problemy: Odwołania do constant-pool (wydaja się zapewnione przez Bicolano) Wyrażenie faktu (nie)zainicjowania obiektu Z braku czasu / determinacji /... : Rozmiar programu Konstruktory protected Zgodność przypisaniowa Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 28 / 33

Co można zdziałać? Formalizacja algorytmu idea Formalizacja algorytmu Formalizacja w Coqu standardowego algorytmu: raczej w wersji dla Bicolano w szczególności bez subroutines być może z poprawkami (Coglio) Wykorzystanie: dowód własności statycznych i strukturalnych zweryfikowany program się nie zacina (bezpośrednio lub pośrednio) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 29 / 33

Co można zdziałać? Formalizacja algorytmu Formalizacja algorytmu status Szczatkowa implementacja DFA ( state shadow ) Elementy wspólne z bytecode proofing Pomysł: parametryzacja / opisanie instrukcji JVM zwn. typy argumentów i wyniku algorytm DFA dla meta-instrukcji dzięki temu łatwość dodawania kolejnych instrukcji JVM Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 30 / 33

Co można zdziałać? Bytecode proofing Formalizacja Bytecode proofing idea Formalizacja w Coqu algorytmu bytecode proofing: raczej w wersji dla Bicolano (bez subroutines) Dowód poprawności typowej wynikowego programu Dowód zachowania semantyki poprawnego programu: jak wyrazić? punkt odniesienia (własności / standardowy algorytm) Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 31 / 33

Co można zdziałać? Bytecode proofing Formalizacja Bytecode proofing status Zrobione Rozdzielenie rejestru na rodzaje Zamiana stosu na rejestr (dla kilku instrukcji) Nie zrobione Pełna zamiana stosu na rejestr DFA SSA Patryk Czarnik (MIM) Weryfikacja Bajtkodu Javy 11 grudnia 2007 32 / 33