W ciągu ostatnich kilku dni w wielu agregatorach pojawiły się publikacje na temat badań przeprowadzonych przez WhiteSource. Firma na podstawie ogólnodostępnych informacji o podatnościach wytypowała „najniebezpieczniejsze języki programowania”. Takie wartościowanie samych języków programowania wzbudza naturalne wątpliwości, ale także zachęca, by sprawie przyjrzeć się bliżej.
Co ciekawe, specjalizująca się (komercyjnie rzecz jasna) w bezpieczeństwie opensource’owego oprogramowania firma WhiteSource, udostępniła w ostatnim czasie na ten temat dwie publikacje. Pierwszą z nich jest kilkunastostronicowy raport (coś pomiędzy infografiką a prezentacją multimedialną) na temat bezpieczeństwa konkretnych języków programowania. Za źródło danych posłużyła amerykańska Narodowa Baza Danych Podatności, dane zgromadzone na GitHubie oraz podczas prac nad otwartym oprogramowaniem.
Zobacz też: Blockchain – rewolucja, która nigdy nie nadejdzie
WhiteSource z sobie znanych przyczyn skupiło się wyłącznie na siedmiu najpopularniejszych w ciągu ostatniej dekady językach. Metodologia polegała na tym, by na podstawie CVE i innych zgłoszeń w oprogramowaniu napisanym w konkretnym języku oceniać bezpieczeństwo samego języka. Tyle wystarczyło, by rezultaty przyjęcia tych cokolwiek egzotycznych założeń podchwycono na łamach licznych mediów na całym świecie, także blogów kierowane do programistów.
Oddajmy głos twórcom raportu. Według ich ustaleń najniebezpieczniejszym językiem programowania jest C – niemal 47% wszystkich podatności znaleziono w programach napisanych właśnie w tym języku. Dalej plasuje się PHP (16,7%), Java (11,4%), JavaScript (10,2%), zaś pierwszą piątkę zamyka Python (5,45%). Pozostałe uwzględnione w raporcie języki to C++ (5,23%) oraz Ruby (4,25%).
Sam raport wspomina co prawda o tym, że na wynik wpłynęły tak oczywiste czynniki, jak wiek C oraz ilość napisanego w tym języku kodu. Pominięte jest jednak to, że choćby te dwa parametry wystarczą, by zanegować cały raport razem z jego metodologią. WhiteSource zdecydowało się i tak go opublikować, zapewne licząc na liczne cytowania w publicystyce. Udało się, ale jak wspomnieliśmy, firma wydała na ten temat dwie publikacje. Druga pojawiła się zaledwie dwa dni po publikacji raportu.
Nie sposób oprzeć się wrażeniu, że po części ma ona wyjaśniać i legitymizować pierwszy raport, a po części dać do zrozumienia, żeby nie brać go na serio. W jego ostatniej części twórcy otwarcie przyznają, że najbezpieczniejszym językiem programowania jest… żaden język i wszystkie zarazem. Nie sposób oczekiwać jednak, że to zgrabne stwierdzenie zostanie podchwycone przez blogerów z równym zaangażowaniem jak wcześniejszy „ranking”.
Dyskusja na temat bezpieczeństwa konkretnych języków programowania może być jednak poprowadzona znacznie sensownej. Można byłoby na przykład odnieść składnie czy funkcjonalność konkretnych języków do możliwości stosowania dobrych praktyk LBS. Można było także odnieść się do takich funkcji języków jak sprawdzanie poprawności typów. Nie sposób pominąć także, że niektóre języki utwardzono przez ograniczanie ich możliwości, jak jest na przykład z Adą.
Zobacz też: 5 przydatnych rozszerzeń do Chrome'a dla każdego front-end developera
Co zatem powinno być wyznacznikiem bezpieczeństwa danego języka wysokiego poziomu i czy można w ogóle powiedzieć, że jest ono własnością języka oprogramowania? Najbardziej przekonujące jest chyba podejście Benjamina C. Pierce’a, który bezpieczeństwo języków rozumie jako wartość binarną – język jest całkowicie opisany i zdefiniowany w swojej specyfikacji albo nie jest. Skutkiem kompletnego opisu jest to, że jakikolwiek błąd zostanie wychwycony i przerwie kompilację. W pozostałych przypadkach o języku bezpiecznym nie może być mowy.
Więcej na temat praktyk Language-Based Security można dowiedzieć się między innymi z wykładu „Lecture Notes on Language-Based Security” Erika Polla, pracy „Language-based information-flow security” Andrieja Sabelfelda i A.C. Myersa czy „Language-Based Secuirty” Dextera Kozena. Wszystkie je można znaleźć w dostępnych bezpłatnie repozytoriach internetowych.