Pod koniec ubiegłego roku odezwało się do nas (tj. do mnie i j00ru) wydawnictwo PWN z propozycją napisania artykułu/raportu o ciekawych błędach popełnianych przez programistów. Jak wiecie, błędami zajmujemy się na co dzień, każdy z nas wygrzebał trochę swoich ulubionych anegdot i klas bugów, i stworzyliśmy coś, co ostatecznie przyjęło formę 40-stronicowego eBooka. Owy artykuł/mini-książkę można pobrać za darmo (registration-walled) na nowo otwartym serwisie IT PWN w dziale Download. Zachęcamy do lektury :)
Link raz jeszcze: http://it.pwn.pl/Raporty/Jak-uniknac-bledow-w-programowaniu
Obok naszego eBooka w serwisie można znaleźć jeszcze jeden - "Przyczyny niepowodzeń projektów IT", autorstwa Bartosza Chrabskiego oraz Karoliny Zmitrowicz (23 strony).
Komentarze / feedback jak zwykle bardzo mile widziane ;>
UPDATE: Kilka osób zgłosiło mi juz kilka błędów w naszym tekście o błędach (we must go deeper), więc... errata.
Sections
- lang: |
- RSS: |
- About me
- Tools
- → YT YouTube (EN)
- → D Discord
- → M Mastodon
- → T Twitter
- → GH GitHub
Links / Blogs
- → dragonsector.pl
- → vexillium.org
- Security/Hacking:
- Reverse Eng./Low-Level:
- Programming/Code:
Posts
- Paged Out! #5 is out,
- CVEs of SSH talk this Thursday,
- Debug Log: Internet doesn't work (it was the PSU),
- FAQ: The tragedy of low-level exploitation,
- Solving Hx8 Teaser 2 highlight videos!,
- Gynvael on SECURITYbreak podcast,
- Paged Out! #4 is out,
- I won't be able to attend CONFidence'24 after all :(,
- xz/liblzma: Bash-stage Obfuscation Explained,
- Two of my bookmarklets: image extraction and simple TTS,
- → see all posts on main page
// copyright © Gynvael Coldwind
// design & art by Xa
// logo font (birdman regular) by utopiafonts / Dale Harris
/* the author and owner of this blog hereby allows anyone to test the security of this blog (on HTTP level only, the server is not mine, so let's leave it alone ;>), and try to break in (including successful breaks) without any consequences of any kind (DoS attacks are an exception here) ... I'll add that I planted in some places funny photos of some kittens, there are 7 of them right now, so have fun looking for them ;> let me know if You find them all, I'll add some congratz message or sth ;> */
Vulns found in blog:
* XSS (pers, user-inter) by ged_
* XSS (non-pers) by Anno & Tracerout
* XSS (pers) by Anno & Tracerout
* Blind SQLI by Sławomir Błażek
* XSS (pers) by Sławomir Błażek
// design & art by Xa
// logo font (birdman regular) by utopiafonts / Dale Harris
/* the author and owner of this blog hereby allows anyone to test the security of this blog (on HTTP level only, the server is not mine, so let's leave it alone ;>), and try to break in (including successful breaks) without any consequences of any kind (DoS attacks are an exception here) ... I'll add that I planted in some places funny photos of some kittens, there are 7 of them right now, so have fun looking for them ;> let me know if You find them all, I'll add some congratz message or sth ;> */
Vulns found in blog:
* XSS (pers, user-inter) by ged_
* XSS (non-pers) by Anno & Tracerout
* XSS (pers) by Anno & Tracerout
* Blind SQLI by Sławomir Błażek
* XSS (pers) by Sławomir Błażek
Comments:
Nieee no, lata 90' były fajne :)
A tak serio, zobaczymy, być może PWN złoży jeszcze w innych formatach (zapytam) ;)
Update: A btw, niektóre czytniki (np. ten defaultowy w Androidzie - QuickOffice) mając tzw. "read mode", w którym wyciągają tekst z oryginalnego layoutu i układają w formie znośnej do czytania na małych ekranach - może ujdzie jako tymczasowe rozwiązanie *nadzieja w oczach* ;>
Nie no serio, jestem pewien, że większość osób czytających twojego bloga z chęcią by zapłaciło, tym bardziej, że wszystkie twoje dotychczasowe materiały są za darmo. Ja bym wolał zapłacić kilka / kilkadziesiąt złotych niż wyrażać te zgody na otrzymywanie spamu :)
A tak przy okazji, to kiedy możemy oczekiwać jakieś 'grubszej' publikacji z Twojej strony? :)
> A tak przy okazji, to kiedy możemy oczekiwać jakieś 'grubszej' publikacji z Twojej strony? :)
http://gynvael.vexillium.org/dump/kto_wie.jpg ;)
Thx ;)
Czym więcej głosów za mobi/epub, tym większa szansa, że PWN da się przekonać ;)
Czekam z niecierpliwością :)
Wybacz, taka branża, nieda się tego uniknąć - już nie mówiąc o tym że jest łatwiej zrozumieć, no chyba że wiesz co to ZŚP?
Zintegrowane Środowisko Programistyczne :)
Hehe cóż mogę powiedzieć - jak stali czytelnicy mojego bloga wiedzą, mam strasznie dużo wtrętów z angielskiego.
Chyba najbardziej mi się oberwało za to: http://niebezpiecznik.pl/post/nowe-zabezpieczenie-supervisor-mode-execution-protection/#comment-36903 ;)
Przyznaję, że osobiście warstwa językowa jest dla mnie dużo mniej istotna, niż warstwa merytoryczna - troszeczkę bazuje na tym, że nasze mózgi działają dużo lepiej niż kompilatory - tj. nawet przy błędach językowych, wtrętach z obcych języków, itp. umieją wywnioskować sens bez większych przeszkód.
Natomiast zdaję sobie sprawę z tego, że dla niektórych osób warstwa językowa musi być jak najbardziej poprawna i staram się w oficjalnych publikacjach po polsku pisać bardziej po polsku niż po angielsku ;)
Co do konkretnego przypadku - co do "defaultowe" - zgadzam się, mogłem napisać "domyślne". Natomiast "registration-walled" to nie do końca "wymaga rejestracji", a lepsze tłumaczenie mi nie przyszło do głowy (pomysły?).
In the end (celowy zwrot po angielsku) to jest blog techniczny, nie polonistyczny, a śmiem twierdzić, że pewne zapożyczenia z faktycznie używanego języka obcego są w tym przypadku dopuszczalne. I zdaję sobie sprawę, że się ze mną nie zgadzasz ;)
@agilob
Ahahaha OK, Twój link wygrał ;)
"Wiele istniejących implementacji memcpy.."
a ciekawostka opisuje memcmp
"Znaku <> oraz \ nie mogą wystąpić..."
Oczywiście, powinno być "Znaki".
Jeśli chodzi o kolizje w tablicach mieszających, to jednak te problemy wnikają z popularnych implementacji, które nie wychodzą poza szkolny schemat. Równie dobrze można kolidujące elementy umieszczać w drzewie samobalansującym (AVL, czy r-b) i wtedy operacja na tablicy mają oczekiwaną złożoność O(1), a pesymistyczną O(log n).
Trochę rozczarowuje sekcja "wielowątkowość", w której opisujcie jedną klasę błędów. A przecież popularnym rodzajem błędów to brak właściwej synchronizacji (sekcji krytycznej) czy zakleszczenia, nie mówiąc o bardziej subtelnych błędach, jak np. nieuwzględnienie barier pamięci.
Brakuje mi tam jeszcze co najmniej jednego elementu, mianowicie niewłaściwej obsługi błędów, tj. albo ignorowanie kodów błędów w C (errno, GetLastError() itp.) albo ignorowanie wyjątków w C++/Java/etc. przez catch-all. Ignorowanie błędu jest gorszym błędem niż zgłoszenie błędu. :)
Ale w sumie to dobry artykuł, szczególnie dla menadżerów, którzy potrafią przyjść i wk***wić pytaniem "czemu nie piszecie bez błędów?". :)
Thx! Dodane do erraty.
@wmu
Nieee no, do ostatecznej wersji artykułu nie trafiła cała masa rzeczy. Założenie jednak brzmiało - weźmy kilka ciekawych naszym zdaniem błędów / klas błędów i je opiszmy (byliśmy też trochę ograniczeni jeśli chodzi o docelową wielkość artykułu) ;)
Co do sekcji wielowątkowość - to niestety/stety bardzo nas ciągnie do błędów, które mają konsekwencje związaną z bezpieczeństwem (szczególnie jeśli konsekwencją jest coś ciekawszego niż DoS). Stąd też do wielowątkowości trafił TOCTTOU a nie zakleszczenia.
Myślałem, żeby wrzucić też TOCTTOU na przykładzie podnoszenia uprawnień w systemach operacyjnych (patrz np. nasz Bochspwn), ale ostatecznie zrezygnowałem z tego pomysłu (to dość szczególny przypadek, który w zasadzie dotyczy głównie programistów tworzących drivery lub kernele, i przez to wydało mi się to trochę zbyt techniczne jak na tą publikację).
Natomiast ogólnie się z tobą zgadzam - czegoś w tej sekcji zabrakło, szczególnie bardziej związanego z programowaniem, a mniej z bezpieczeństwem.
Co do niewłaściwej obsługi błędów - dobry pomysł, w sumie mogło to tam trafić. Na liście mieliśmy coś podobnego - używanie ASSERTów w C++ do testów walidujących dane od użytkownika (co ofc nie ma sensu, bo ASSERTy są usuwane z buildów w release mode, więc te testy znikają), ale też nie trafiło do dokumentu.
Co do floatów, faktycznie trochę ich tam brakuje (szczególnie, że to bardzo ciekawy temat). Jest jeden przykład na stronie 33:
9223372036854775807 == “9223372036854775808” (dla 64-bitowych wersji PHP)
ale nie jest on należycie wytłumaczony (tj. czytelnik może się nie domyślić, że chodzi tam o konwersje long na double i stratę precyzji).
Co do hashy - yep, zgoda. Tak mogłoby to zostać rozwiązane ;)
@RaveStar
Mam nadzieje, że będzie w przyszłości tak jak piszesz - tj. coraz więcej nowych projektów będzie powstawać w językach, w których trudniej sobie strzelić w stopę niż w C/C++ czy PHP :)
Pozostanie wtedy tylko problem istniejących produktów napisanych w tych bardziej błędogennych językach, z którym pewnie jeszcze długie lata będziemy się męczyć.
bardzo ciekawa lektura ;) będą jakieś nowe filmiki wkrótce na Twoim kanale? ;>
Thx ;)
Niestety nie w najbliższym czasie (chce najpierw uporać się z tym co hintowałem w odpowiedzi na komentarz Logana). Ale później tak, planuje więcej czasu na to poświęcić.
Link : <cut>
Mam nadzieje, że będzie w przyszłości tak jak piszesz - tj. coraz więcej nowych projektów będzie powstawać w językach, w których trudniej sobie strzelić w stopę niż w C/C++ czy PHP :)" - I wszystko pięknie-ładnie,tylko że żeby przekonać ludzi do odejścia od kompatybilności wstecznej trzeba dać im narzędzie lepsze od C/C++ czy PHP albo pozwalające przepisać te rzeczy szybciej na nowo.Żeby się streścić jak to ja,newbie widzę w wypadku C/C++: Java ? bez żartów. Język E ? Pomysł chyba fajny,ale mało popularny i interpretowalny na Javie. Ada ? bezpieczniejszy język,ale komplikacje i ograniczenia duże,wiec lenistwo wygrywa.Inne języki ? Ba,które ? Samo Google wypuściło "go" co do którego porządnych opinii nie sposób zebrać bo nie jest chyba skończone.Tak samo jak D które miało zastąpić C/C++.
Tak więc mam pytanie @Gynvael Coldwind (takie co to tylko tak niedouczony newbie jak ja może zadać wkładając przysłowiowy "kij w mrowisko" :) ): To jakie języki są wg. ciebie bezpieczniejsze od odpowiednio C/C++ i porównywalnie wydajne jeśli chodzi o napisanie i wykonanie itd i można by je uznać za coś lepszego ? Widzisz już teraz godnych konkurentów dla C ?
Haha trafiłeś w sedno ;)
Z każdym językiem jest jakiś problem. Jak już są w pełni zdefiniowane, bufory mają kontrolowaną wielkość, etc, to się okazuje, że są albo wolne, albo mają słabej jakości standardową bibliotekę (np. częściowo zaimplementowaną w C/C++ z typowymi dla tych języków błędami), albo same w sobie pozostawiają wiele do życzenia, albo programiści ich nie lubią "bo tak". Jak nie są w pełni zdefiniowane, to sobie ludzie notorycznie robią te same błędy. Do tego prawie zawsze dochodzi problem jakości ekosystemu, z czym bywa słabo chyba we wszystkich językach jakie mi przychodzą do głowy (chociaż OK, przyznaję, że jest coraz lepiej w tym względzie).
Natomiast na obecną chwilę trudno mi podać jakiś przykład języka, który wymusza/gwarantuje super bezpieczny kod (pomijam ofc błędy logiczne, bo te można popełnić w każdym języku). Póki co chyba jesteśmy zmuszeni trzymać się tego co jest, dorzucając do tego pair-programming/peer-review kodu wrzucanego na produkcje, dobry style-guide zabraniający używać części języka/biblioteki standardowej, które są uznane za niebezpieczne + zestawy dobrych frameworków i bibliotek, z których można korzystać (o ile takie się znajdzie ;p).
Brakuje Ci (jak wiesz) 5/7 i 6/7 - oba są związane z komentarzami, a do tego 5/7 można na dwa sposoby triggernąć.
Jest jeszcze -1/7 związany z download ;)
Hmm, skoro 8/7 masz, to rozumiem, że panel admina też znalazłeś ;)
Cheers,
Wiesz może dlaczego PDF jest niedostępny??
Dzięki za dobra robotę.
Pozdrawiam
Wiesz może dlaczego PDF jest niedostępny??
Dzięki za dobra robotę.
Pozdrawiam
Hmm, sprawdziłem przed chwilą i wydaje się wszystko działać.
Add a comment: