Innehåller brister i systemprogramvarukod är svagheter eller sårbarheter som är djupt inbäddade i programvarans design eller grundläggande arkitektur. De är inte nödvändigtvis buggar som lätt kan fixas med en lapp, utan snarare svagheter som är svåra eller omöjliga att eliminera utan betydande omformning eller omskrivning. Dessa brister härrör ofta från:
* Komplexitet: Systemprogramvara är oerhört komplex. Den stora volymen av kod, interagerande moduler och olika funktionaliteter gör det oerhört svårt att fullt ut förstå och verifiera hela systemets beteende. Denna komplexitet skapar möjligheter för subtila brister att dölja, även efter omfattande tester.
* Underliggande hårdvarubegränsningar: Systemprogramvara interagerar direkt med hårdvara. Begränsningar eller egendomar i den underliggande hårdvaran kan utsätta programvaran för sårbarheter som är svåra att mildra rent med mjukvarumedel. Till exempel kan en svaghet i hur CPU hanterar minnesåtkomst utnyttjas, även med perfekt skriven kod.
* Samtidiga frågor: Moderna system förlitar sig starkt på samtidiga processer och trådar. Att hantera samtidig tillgång till delade resurser (som minne eller filer) är notoriskt svårt. Fel i synkroniseringsmekanismer, rasförhållanden och dödlås är vanliga inneboende brister som kan leda till systeminstabilitet, kraschar eller säkerhetssårbarheter.
* ofullständiga eller tvetydiga specifikationer: Om de initiala designspecifikationerna för systemprogramvaran är ofullständiga, tvetydiga eller inkonsekventa är det troligt att den resulterande koden kommer att innehålla inneboende brister. Dessa brister kanske inte är uppenbara förrän programvaran är distribuerad och används på oförutsägbara sätt.
* Säkerhetsöverväganden är inte prioriterade: Om säkerhet inte var ett primärt problem under design- och utvecklingsfaserna, kan den resulterande programvaran ha inneboende sårbarheter som är svåra att ta itu med senare. Detta är särskilt problematiskt för systemprogramvara, eftersom en kompromiss kan få långtgående konsekvenser.
* arvskod och teknisk skuld: Äldre systemprogramvara innehåller ofta "teknisk skuld" - kod som fungerar men är ineffektiv, dåligt dokumenterad eller svår att förstå. Detta kan hindra förmågan att identifiera och korrigera inneboende brister. Refactoring eller omskrivning av en sådan kod är ofta ett enormt företag.
Exempel på manifestationer:
* buffertflöden: Ett klassiskt exempel där dålig minneshantering leder till sårbarheter.
* Rasförhållanden: Två eller flera processer åtkomst till och manipulera delade data samtidigt, vilket leder till oförutsägbara resultat.
* sårbarheter för förnekande av service: Utnyttjande som gör ett system oanvändbart, ofta på grund av designbrister som inte hanterar resursutmattning ordentligt.
* Privilegi eskalering: Brister som gör det möjligt för en användare med lägre privilegier att få förhöjd åtkomst till systemet.
Att ta itu med inneboende brister kräver ofta en grundläggande omprövning av systemets arkitektur och design, snarare än att bara fixa enskilda buggar. Det är ofta en kostsam och tidskrävande process, vilket belyser vikten av rigorös design och grundlig testning från början.