ebook_programistyczne_potkniecia.pdf
(
1954 KB
)
Pobierz
1
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
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
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
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
Plik z chomika:
Rolek__
Inne pliki z tego folderu:
Unicode w Visual Cpp.zip
(117 KB)
ebook_programistyczne_potkniecia.pdf
(1954 KB)
menu.7z
(1 KB)
wobron.zip
(1282 KB)
wobron.exe
(1897 KB)
Inne foldery tego chomika:
dx10
Filmy
Galeria
Inbox
Programiki
Zgłoś jeśli
naruszono regulamin