Bristande säkerhet i öppna källkod-projekt

Permalänk
Medlem
Skrivet av Dumsnuten:

Nja. Din egna källa visar på att operativsystem som bygger på Öppen källkod har ett mycket större antal kända sårbarheter än Operativsystem med stängd källkod. Tittar du på t.ex. Chrome (ca 66% av användarna) och Firefox (ca 3%) har Chrome bara ca 30% fler kända sårbarheter än Firefox. Men du har 20x antalet Chrome -användare än Firefox.

Utifrån källan går det inte att dra den här slutsatsen, den visar bara råa siffror utan någon analys.

De senaste åren har det upptäcks många fler sårbarheter i Chrome än i Firefox. Att det historiskt har upptäckts fler sårbarheter i Firefox kan bl.a bero på att Chrome är mycket nyare och har undvikit vissa fallgropar som Firefox hade/har. Firefox har väl gått över till Rust i en del av koden, så mängden minnesrelaterade CVEs borde gått ner.
Firefox har historiskt varit mer öppen vad det gäller extensions och browserändringar, det ger en större attackyta.

Firefox kanske har haft ett bättre bug bounty program. Nu verkar det vara rätt så likt.

Osv.

Permalänk
Medlem
Skrivet av Dumsnuten:

Nja. Din egna källa visar på att operativsystem som bygger på Öppen källkod har ett mycket större antal kända sårbarheter än Operativsystem med stängd källkod.

Det blir ju dock lite galet att jämföra siffror för en distribution med *massor* av applikationer inräknade med t.ex. Windows där så ej är fallet (jag kan ha missuppfattat, men det lät så?).

Skrivet av Elgot:

Så enkelt är det väl inte att dra några slutsatser heller? Sannolikt beror det på hur enkelt det är att granska koden (öppen källkod är ju extremt tillgänglig), hur intressant det är att hitta en sårbarhet (många användare är troligen intressantare), hur stor ära som står på spel (att hitta något i linuxkärnan smäller nog högt, till exempel) och vilken kvalitet koden faktiskt håller.

Det som verkar driva på är väl främst vad det går att få pengar för. Och då är det ju saker som många använder, rent generellt.
Och i det läget så kan man ju kosta på sig att ha folk som kan läsa assembly...

Så nej, jag upplever inte heller att det är någon milsvid skillnad för de viktigaste projekten. Men det är olika dynamik, oavsett projektstorlek.

Skrivet av Dumsnuten:

Tittar du på t.ex. Chrome (ca 66% av användarna) och Firefox (ca 3%) har Chrome bara ca 30% fler kända sårbarheter än Firefox. Men du har 20x antalet Chrome -användare än Firefox.

Skrivet av Elgot:

Chrome är ju till stora delar också öppen källkod, för övrigt.

Ja, Chrome är *mestadels* open source, och fel i "Chrome" är oftast i praktiken fel i Chromium och då finns ju samma fel typiskt även i Edge, Brave, Vivaldi, Opera, etc...

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av Elgot:

Problemet här är ju dock att man inte vill avslöja något om vad man gör. Annars använder man gärna öppen källkod (och tittar avundsjukt på hur smidigt utvecklingen går).

Det kan jag förstå, min poäng var mer att det finns lägen där icke open-source är ett bättre alternativ.

Visa signatur

You have earned my respect and my friendship.

Permalänk
Hedersmedlem
Skrivet av Thor:

Det kan jag förstå, min poäng var mer att det finns lägen där icke open-source är ett bättre alternativ.

Ja, men det är ett kompromissande. Man är typiskt medveten om att det är problematiskt att inte fler granskar koden, men det finns fler faktorer att beakta.

Permalänk
Medlem
Skrivet av pine-orange:

Artikeln baseras på det som flera myndigheter faktiskt har tittat på, jag tycker inte SweC behöver få öppen källkod projekt att framstå som bättre bara för att du anser det. Du behöver bevisa det mha källor eller någon trovärdig metodik om du vill använda egen data.
Jag tycker det är lite förenklat från myndigheternas håll att bara titta på minnessäkra och minnesosäkra språk. Det går att skriva minnesosäker kod i minnessäkra språk och det finns många hjälpmedel för att säkra upp minnesosäkra språk.
Det är inte alls säkert att det är så. Bara för att många fler ögon kan titta på koden betyder inte att det är det som faktiskt händer. Om jag tittar på statistik om CVEs per platform verkar det vara rätt så blandat.

Skrivet av Thor:

Jag tycker vi bokar in globen så kan du föreläsa för världens militärindustrier om hur bra det är med öppen källkod så får vi se hur många som dyker upp.

Givetvis så fungera stängd källkod skit om det hanteras fel, på tal om att brödrostar fungerar uselt under vatten.

Hur är det med läsförståelsen? Dumsnuten sammanfattade det hela väldigt bra på föregående sida. Det finns ingenting som visar på att det skulle finnas ”bristande säkerhet i viktiga öppen källkod-projekt”.

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Datavetare
Skrivet av pine-orange:

Jag tycker det är lite förenklat från myndigheternas håll att bara titta på minnessäkra och minnesosäkra språk. Det går att skriva minnesosäker kod i minnessäkra språk och det finns många hjälpmedel för att säkra upp minnesosäkra språk.
Det är inte alls säkert att det är så. Bara för att många fler ögon kan titta på koden betyder inte att det är det som faktiskt händer. Om jag tittar på statistik om CVEs per platform verkar det vara rätt så blandat.

Det är sant att de flesta minnesäkra språk har något sätt att slå av dessa verifikationer. Men det viktiga här är: det är opt-out och det är väldigt ovanligt att det används i verkliga program. Om det visar sig att man ändå får den här typen av bug i ett minnesäkert språk så vet man ju att det måste finnas någonstans när man är i "unsafe context" alt. anropar icke-minnessäkert bibliotek.

Och sant att det går att göra statisk analys samt rätt mycket göra "opt-in" för att få liknande checkar i C++. Problemet är just att det är "opt-in" och det räcker med att man låter bli på ett enda ställe som råkar ha en bug så har man ett potentiellt säkerhetshål.

Skrivet av Alexraptor:

Jag tror du har missuppfattat lite. Jag menade inte alls på att det var dåligt, utan att C++ ger dig mer direkt kontroll över minneshantering, vilket så klart medför bättre möjligheter till optimering.

Myndigheterna tycker att alla bör använda minnessäkra programmersingspråk, men specifikt spelutveckling har ju en lång tradition av en massa fulhacks för att maximera prestanda, som tex gamla goa 0x5F3759DF

Det finns helt klart en del saker man kan göra i C++ som ibland har relevans för spel som bara är möjligt med "unsafe C#".

Men på det stora hela handlar det mest om att ha koll på vad man gör. C++ och C# kan prestera rätt snarlikt i ett spel-kontext, problemet är att man behöver skriva C#-koden på ett sätt som inte är "normalt" för typiskt back-end kod skrivet i språket.

Sett till ren beräkningskraft lär det skilja väldigt lite mellan samma algoritmer skrivna i C++ eller C#. Spel använder typiskt arena-allokatorer och andra custom-allokererare i de mest prestandakritiska delarna, är fullt möjligt att implementera det inom ramen av "normal" C#.

Sen finns ändå en potentiell lite extra overhead i C# då den alltid kollar att man inte skriver utanför minnet (går att stänga av med "unsafe"), i C++ är det opt-in att ha en sådan check (och det normala är att man inte opt-in detta, vilket potentiellt ger problem som diskuteras här).

Sen finns det helt klart en historik med rätt coola algoritmer i spelvärlden. Det du nämner ser rätt "magiskt" ut, men är egentligen bara en applikation av logaritmlagar kopplat med hur flyttal representeras på våra CPUer. Och det är också ett exempel på en "optimering" som helt gått ur tiden, både x86_64 och ARM64 har specifika instruktioner som beräknar just 1/sqrt(x) som är snabbare.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Det finns helt klart en del saker man kan göra i C++ som ibland har relevans för spel som bara är möjligt med "unsafe C#".

Men på det stora hela handlar det mest om att ha koll på vad man gör. C++ och C# kan prestera rätt snarlikt i ett spel-kontext, problemet är att man behöver skriva C#-koden på ett sätt som inte är "normalt" för typiskt back-end kod skrivet i språket.

Sett till ren beräkningskraft lär det skilja väldigt lite mellan samma algoritmer skrivna i C++ eller C#. Spel använder typiskt arena-allokatorer och andra custom-allokererare i de mest prestandakritiska delarna, är fullt möjligt att implementera det inom ramen av "normal" C#.

Sen finns ändå en potentiell lite extra overhead i C# då den alltid kollar att man inte skriver utanför minnet (går att stänga av med "unsafe"), i C++ är det opt-in att ha en sådan check (och det normala är att man inte opt-in detta, vilket potentiellt ger problem som diskuteras här).

Sen finns det helt klart en historik med rätt coola algoritmer i spelvärlden. Det du nämner ser rätt "magiskt" ut, men är egentligen bara en applikation av logaritmlagar kopplat med hur flyttal representeras på våra CPUer. Och det är också ett exempel på en "optimering" som helt gått ur tiden, både x86_64 och ARM64 har specifika instruktioner som beräknar just 1/sqrt(x) som är snabbare.

Jo tack, jag är själv utbildad spelprogrammerare.

Unity är i det här kontextet en intressant spelmotor, då den är byggd med C++ men har C# som ett scripting språk. Dock har Unity moduler som ger en åtkomst till direkt minneshantering, som t.ex Unity.Collections som har klasserna NativeArray och NativeList, vilka används flitigt inom Unity DOTS.

Visa signatur

| Corsair Obsidian 1000D | AMD Ryzen 9 5950x 3.4 GHz(5 GHz boost) med Corsair iCue H170i Elite Capellix | Asus ROG Crosshair VIII Extreme | G.Skill Trident Z neo, 2x16GB 3600MHz C16 | ROG Strix LC GeForce 3090 Ti 24GB | 1x Seagate FireCuda 530 2TB, 1x Samsung 850 EVO 250GB, 1x Samsung 970 EVO 1TB, 2x 1TB HDD, 1x Seagate Ironwolf 16TB HDD | ASUS ROG Thor 1000W Platinum II | ASUS PG279Q & ASUS XG27AQM|

Permalänk
Medlem
Skrivet av Dimman:

Hur är det med läsförståelsen? Dumsnuten sammanfattade det hela väldigt bra på föregående sida. Det finns ingenting som visar på att det skulle finnas ”bristande säkerhet i viktiga öppen källkod-projekt”.

Skrivet av Rapporten:

Hence, we determine that most critical open source projects analyzed, even those written in memory-safe languages, potentially contain memory safety vulnerabilities. This can be
caused by direct use of memory-unsafe languages or external dependency on projects that use memory-unsafe languages. Additionally, low-level functional requirements to disable
memory safety may create opportunities for memory safety vulnerabilities in code written in otherwise memory-safe languages. These limitations highlight the need for continued
diligent use of memory safe programming languages, secure coding practices, and security
testing.

Bristande säkerhet handlar i det här fallet inte om att det måste ha hänt något, det handlar om att risken är påtaglig att någon säkerhetsincident kan inträffa. Anledningen till den förhöjda risken är användningen av minnesosäkra språk. Det är som när det sker en inspektion och det finns några saker att förbättra. Syftet är att förebygga, innan något allvarligt inträffar.

Permalänk
Datavetare
Skrivet av Alexraptor:

Jo tack, jag är själv utbildad spelprogrammerare.

Unity är i det här kontextet en intressant spelmotor, då den är byggd med C++ men har C# som ett scripting språk. Dock har Unity moduler som ger en åtkomst till direkt minneshantering, som t.ex Unity.Collections som har klasserna NativeArray och NativeList, vilka används flitigt inom Unity DOTS.

Just i fallet NativeArray/NativeList får man egentligen inte någon extra prestanda så länge man bara befinner sig i C# kontext jämfört med System.Collections.Generic. Är inte helt med på exakta detaljer kring NativeArray, men gissar att det primärt handlar om att man där allokerar en "vanligt C/C++ buffert" där den (virtuella) adressen är fixerad så länge man inte friar minne.

Det man slipper i hoppet mellan C# och C/C++ med NativeArray är att "låsa fast" minnet medan man befinner sig i C/C++ kontext (så inte GC får för sig att flytta data i virtuellt RAM space).

Ur det "säkerhetsperspektiv" denna artikel handlar om är det ingen skillnad, även NativeArray verifierar att man inte skriver utanför gränserna. Men en rätt trevlig sidoeffekt man typiskt får från de egenskaper man behöver i ett GC-språk är att en "pekare" inte är pekare i C/C++ mening, utan är mer det man i C/C++ kallar "handles", det trevliga är att sådant minne kan flyttas runt i (virtuellt) address-space utan att "pekare" till minnet blir ogiltiga.

Sen är Unitys användning av C++ också ett målande exempel på att användandet av C++ inte nödvändigtvis betyder bättre prestanda. Så länge man inte använder IP2CPP kör man ju en (mono-baserad) virtuell maskin, d.v.s. helt "normal" .NET/C# beteende.

Men prestandamässigt är VM:en Unity använder rätt kass ställd mot .NET-core ramverket (som är nästan helt skrivet i C# sedan övergången till Roslyn). Gjorde några snabbtester, .NET 8 är lika snabb eller snabbare än Unity med IL2CPP som i sin tur är nästan dubbelt så snabb som "vanliga" Unity maskineriet (som är C++ baserat under huven).

Det kändes rätt avlägset på 90-talet när man sa "det är teoretiskt möjligt att Java med JIT kommer kunna bli lika snabbt eller till och med snabbare än C/C++". Man var inte nära under många år, men det har hänt väldigt mycket inom det området under de snart 30 år det gått sedan Java lanserades. Idag är faktiskt de bästa JVM:erna och CLR:erna på den prestandanivå man pratade om.

Kanske inte super-relevant till just spel, men finns faktiskt en del optimeringar relaterade till multi-thread som är möjliga när man har en GC men som inte kan göras utan explicit synkronisering med avsaknad av GC (för att undvika ABA-problemet).

DOTS är ju ett annat exempel (utöver modern JIT) där man i praktiken kan få bättre prestanda i högre nivå ramverk jämfört med normal C/C++. Visst kan man hantera SOA och fördelning av data på ett säkert och optimalt sätt direkt i C/C++, men det är otroligt komplex och lätt att göra fel. DOTS, eller mer ECS, sätter en del krav på hur man skriver sitt program och p.g.a. av det kan man göra rätt coola optimeringar (inte helt olikt Nvidia CUDA kan köra skalär kod på tusentals "CUDA-kärnor").

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk

Angående C++ så är det inte utdöende inom i princip allt där prestanda inte är superviktigt?

Alltså folk eftersträvar en lösning som är så billig som möjligt, det ska vara en lösning som folk lätt kan lära sig, många ska kunna koda den och bra säkerhet emot misstag ska finnas.
Ofta så är dessutom programmering bara en delkunskap man ska ha utan man behöver ha domänkunskap av det som man ska styra.

Företag brukar inte gilla detta att folk gör mer komplicerade lösningar i onödan så att de på något sätt blir outbytbar, tvärtom ska lösningen vara sådan så att fler personer har möjlighet att fortsätta med så kort uppstartssträcka som möjligt.
Skräckexemplet kan vara elektrikern som gör en c++ lösning och sedan ska de hitta en annan behörig elektriker som också kan c++.

Permalänk
Medlem
Skrivet av Dimman:

Detta måste väl vara ett av Swec’s lågvattenmärken till artikel? Peka ut opensource-projekt som osäkra när det i realiteten sannolikt finns magnituder fler kommersiella och closed source-projekt som bättre hade passat titeln.

Om något så bidrar öppen källkod till ökad säkerhet. Jag tycker mig exempelvis läsa betydligt oftare om säkerhetsproblem i Windows än i Linux…

Jag jobbar i branschen och jag fattar gisten av artikeln, men tycker vinklingen är ganska vidrig.

Sweclockers är teknikbloggarnarnas nya Aftonbladet.

Visa signatur

Spara på minnen, inte saker.

Permalänk
Medlem
Skrivet av Hund:

Sweclockers är teknikbloggarnarnas nya Aftonbladet.

Skrivet av pine-orange:

Bristande säkerhet handlar i det här fallet inte om att det måste ha hänt något, det handlar om att risken är påtaglig att någon säkerhetsincident kan inträffa. Anledningen till den förhöjda risken är användningen av minnesosäkra språk. Det är som när det sker en inspektion och det finns några saker att förbättra. Syftet är att förebygga, innan något allvarligt inträffar.