ebook_programistyczne_potkniecia.pdf

(1954 KB) Pobierz
1
1318517348.007.png
Spis treści
Wstęp ............................................................................3
Arytmetyka i obliczenia .................................................4
Przekroczeniezakresuliczbcałkowitych...........................4
Obcięciezakresuliczbcałkowitych...................................8
Wycieki danych. ..........................................................12
Głębokieukrycie.........................................................12
Użycieniezainicjalizowanejpamięci...............................13
Stabilność i niezawodność ...........................................20
Kolizjewtablicachhaszujących.....................................20
Wyszukiwaniewszystkiego...........................................22
Wielowątkowość i wielozadaniowość ..........................24
Wyścigiwsystemie.....................................................24
Dane wejściowe ..........................................................27
Deserializacjaniezaufanychdanych...............................27
Logikaaplikacji...........................................................31
Oscylatorywalutowe...................................................31
Dziwactwa..................................................................33
Nierównerówności......................................................33
Kryptografia ................................................................35
Wartości(nie)losowe...................................................35
Przenośność kodu .......................................................37
Nazwyplików..............................................................37
Zakończenie ................................................................39
Bibliografia .................................................................40
2
1318517348.008.png 1318517348.009.png
Wstęp
Historia tworzenia i testowania oprogramowania jest ściśle związana
zhistoriąelektronicznychmaszynliczących,którejpoczątkisięgająlat‘30
i‘40poprzedniegowieku,kiedytosławnepostacikomputerowegoświata
takiejakAlanTuring,JohnvonNeumannczyTommyFlowerstworzylipod-
walinywspółczesnejinformatyki.Odczasupowstaniapierwszejprogramo-
walnejmaszyny software stałsięnieodłącznączęściąkażdegokomputera,
któregorozwójniedługopóźniejwyewoluowałdoniezwyklerozległejiskom-
plikowanejdziedzinynaukiwswoichpodstawachodrębnejod hardware ,
czyliizycznieistniejącegosprzętu,naktórymjestwykonywany.Zewzględu
naludzkąomylnośćorazfakt,żeprogramowaniejestpodwielomawzględa-
miprocesemtrudnym,wymagającymkoncentracji,wiedzyorazdoświadcze-
nia,błędy(tzw. bugi )wszelkichrodzajówtowarzyszyłyitowarzysząpodziś
dzieńtwórcomoprogramowania,stającsięwręczintegralnąiakceptowaną
częściąichpracy.
Błędyznajdującesięwprogramachkomputerowychmożnadzielićnawie-
leróżnychkategorii:błędywskładnilublogiceaplikacji,błędywpływające
nastabilnośćlubbezpieczeństwosystemu,błędyujawniającesięwtrakcie
pisaniakodu,potygodniach,latach,anawetdekadach!Whistoriiostatnich
latznajdziemybłędyktórewżadenznaczącysposóbniewpłynęłynalosy
światajakrównieżtakie,którychskutkibyłytragiczne,airmyipaństwowe
organizacjeobciążyłystratamirzędumilionów,anawetmiliardówdolarów.
Naturalnymwydajesię,żeniesposóbcałkowiciewyeliminowaćwszystkie
usterkiwprogramachsterującymiaparatami,komórkami,komputeramido-
mowymi,reaktoramijądrowymiczysztucznymisatelitami;możemyjednak
minimalizowaćliczbępopełnianychpomyłekoraznaprawiaćbłędy,zanim
znajdąsięonewkodzieprodukcyjnym.Wniniejszymartykuleprzedstawia-
myprzykładykilkunastunajciekawszych,zdaniemautorów,rodzinbłędów
iprogramistycznychpotknięć,wrazzwyjaśnieniemichnatury,możliwości
unikaniaorazpowiązanymiprzykładamizżycia.Zapraszamydolektury!
3
1318517348.010.png 1318517348.001.png 1318517348.002.png
Arytmetyka i obliczenia
Przekroczenie zakresu liczb całkowitych
Zaczniemyodbardzoprostegobłędu,któryspotykasięwwielujęzykach
programowania - przekroczenia zakresu liczb całkowitych, lub częściej
integer overlow (dosłownie przepełnienie liczby całkowitej ).Przykładykodu
zawierającegobłądtegotypuwróżnychjęzykachprogramowaniaprzedsta-
wionesąponiżej:
// C, C++
unsigned short dlugosc_tekstu = OdbierzDlugoscTekstu ( socket ) ;
char * bufor = ( char *) malloc ( dlugosc_tekstu + 1 ) ;
OdbierzTekst ( bufor , dlugosc_tekstu , socket ) ;
bufor [ dlugosc_tekstu ] = ‘\0’ ;
// ActionScript
var szerokosc : int = PobierzInt ( plik );
var wysokosc : int = PobierzInt ( plik );
var wielkosc : int = szerokosc * wysokosc ;
W niektórych językach programowania takich jak C, C++, Objective-C,
ActionScript czy Java, zmienne typu całkowitego mają ograniczony roz-
miar(zazwyczajwyrażanywbitach;np.typ int wActionScriptmawielkość
32bitów),acozatymidzie,ograniczonyzakreswartościktóremożna
wnichprzechować.Wzasadziedowolnaksiążkatraktującaodanymjęzyku
programowaniarozpoczynaopisdostępnychtypówzmiennychodpodania
zakresuwartości,któremożnawnichprzechować;wprzypadkuwspomnia-
negotypu int wActionScriptbędątowartościod-2 31 do2 31 -1(czyliodokoło
minusdwóchmiliardów,dookołodwóchmiliardów).
Powstajewięcpytanie-cosięstanie,jeśliprogramwtokuwykonywania
przekroczy dozwolony zakres zmiennej, w rezultacie wykonanej właśnie
operacjiarytmetycznej?Możliwościjestoczywiściekilkaizależąoneza-
równoodkonkretnejtechnologii,jejwersji,typuzmiennej,jakisystemu,
czy architektury procesora na którym dany program jest uruchamiany.
Wzdecydowanejwiększościprzypadkówdoczynieniamamyztzw.arytme-
tyką“modulo”która,rozpatrująckwestięzniskopoziomowejperspektywy,
4
1318517348.003.png 1318517348.004.png
polegana“przycięciu”wynikuoperacjidodolnychN-bitów,któremieszczą
sięwzakresiedanegotypu(dlatypówliczbnaturalnychjesttorównoważne
zwykonaniemdzieleniamoduloprzezmaksymalnąwartość,którąmożna
pomieścićwzmiennejpowiększonąojeden).
RozważmytenproblemnapodanympowyżejprzykładziezActionScript-
jeślifunkcja PobierzInt zwróciłabywobuprzypadkachwartość70000,to
wynikiemmnożeniabyłobyoczywiście4900000000(niecałepięćmiliar-
dów).Binarnie(wsystemiedwójkowym)możnatęliczbęzapisaćjako:
1 0010 0100 0001 0000 0001 0001 0000 0000
Niestety,liczbacałkowitategorzęduwymagadowyrażenia33bitów,aza-
deklarowanawprzykładziezmienna wielkosc marozmiarjedynie32bitów.
Ztegopowodunajbardziejznaczącaczęśćwynikuzostanieodrzucona:
1 0010 0100 0001 0000 0001 0001 0000 0000
Wefekcieotrzymujemyznaczniemniejsząliczbę-605032704-któranijak
masiędooczekiwanegowyniku.
Błędytegotypuwystępująwoprogramowaniuniezwykleczęsto,jednakje-
dyniewnielicznychprzypadkachobjawiająsiępodczascodziennejpracy-
zregułyprogramywnormalnychwarunkachniemają“okazji”operowaćna
danychwystarczającoobszernych,bydoprowadzićdoprzepełnieniazmien-
nejtypuwybranegoprzezprogramistę.Błądtegotypumożezostaćjednak
celowowywołanyprzezosobęoniecnychzamiarach,która,będącwsta-
niespreparowaćnieprzewidzianeprzezautorawarunkidziałaniaprogramu,
możedoprowadzićdowykonaniakontrolowanegoprzezniąkoduwkon-
tekściepodatnejaplikacji(czylidoprzejęcianadniąkontroli).Wzwiązku
ztymprzekroczeniezakresuzmiennej,szczególniewprzypadkujęzyków
CorazC++(choćnietylko),możeprowadzićdopoważnychproblemów
związanychzbezpieczeństwemaplikacji,awkonsekwencjicałegosystemu
komputerowego.
Za przykład może posłużyć tutaj exploit zaprezentowany przez hakera o pseudonimie
PinkiePie na konferencji PacSec w Tokio w listopadzie 2013. PinkiePie, wykorzystu-
jąc właśnie błąd przepełnienia zmiennej typu całkowitego w przeglądarce Google
Chrome (a następnie kilka kolejnych błędów), był w stanie wykonać dowolny kod na
smarfonach Nexus 4 oraz Samsung Galaxy S4, tym samym zdobywając nagrodę w
wysokości 50,000 USD [1] .
CIEKAWOSTKA
5
1318517348.005.png 1318517348.006.png
 
Zgłoś jeśli naruszono regulamin