Megosztás a következőn keresztül:


Csomagfüggőségek naplózása biztonsági rések esetén

Tudnivalók a biztonsági auditokról

A csomagkezelők, például a NuGet biztonsági auditja egy olyan folyamat, amely magában foglalja a szoftverprojektekben szereplő csomagok biztonságának elemzését. Ez magában foglalja a biztonsági rések azonosítását, a kockázatok kiértékelését és a biztonság javítására vonatkozó javaslatok meghozatalát. Az audit magában foglalhatja maguknak a csomagoknak a felülvizsgálatát, valamint az esetleges függőségeket és az azokhoz kapcsolódó kockázatokat. Az audit célja, hogy azonosítsa és csökkentse a támadók által kihasználható biztonsági réseket, például a kódinjektálást vagy a helyek közötti szkriptelési támadásokat.

Van egy blogbejegyzésünk is, amely bemutatja az általunk ajánlott eljárást arra az esetre, ha a projekt egy ismert sebezhetőséget tartalmazó csomagot használ. Emellett eszközöket is javasolunk, amelyek segítségével további információkhoz juthat.

Szolgáltatás rendelkezésre állása

NuGet .NET SDK Visual Studio Tulajdonság
5.9 .NET 5 SDK (5.0.200) Nincs adat. dotnet list package --vulnerable
6.8 .NET 8 SDK (8.0.100) Visual Studio 2022 17.8 NuGetAudit for PackageReference
6.10 Nincs adat. Visual Studio 2022 17.10 NuGetAudit számára packages.config
6.11 .NET 8 SDK (8.0.400) Visual Studio 2022 17.11 NuGetAuditSuppress a PackageReference-hez
6.12 .NET 9 SDK (9.0.100) Visual Studio 2022 17.12 Naplózási források. NuGetAuditSuppress for packages.config.

Biztonsági audit futtatása a restore

A restore parancs automatikusan fut, amikor egy gyakori csomagműveletet hajt végre, például először tölt be egy projektet, új csomagot ad hozzá, frissíti a csomagverziót, vagy eltávolít egy csomagot a projektből a kedvenc IDE-ben. A függőségeket a ellenőrzési források által biztosított ismert biztonsági rések listájával ellenőrzik.

  1. A parancssorban keresse meg a projekt vagy a megoldás könyvtárát.
  2. Futtassa a restore az Ön által választott eszközzel (pl. dotnet, MSBuild, NuGet.exe, VisualStudio stb.).
  3. Tekintse át a figyelmeztetéseket, és kezelje az ismert biztonsági réseket.

A NuGet-naplózás konfigurálása

A naplózás konfigurálható MSBuild tulajdonságokon keresztül egy olyan MSBuild fájlban, amely a projekt részeként van kiértékelve. Javasoljuk, hogy a naplózás adattárszinten legyen konfigurálva.

MSBuild tulajdonság Alapértelmezett Lehetséges értékek Jegyzetek
NuGetAuditMode Lásd alább az 1-et direct és all Ha csak a legfelső szintű függőségeket szeretné naplózni, beállíthatja az értéket a következőre direct: . A NuGetAuditMode nem alkalmazható packages.config projektekre.
NuGetAuditLevel alacsony low, moderate, highés critical A jelentés minimális súlyossági szintje. Ha látni szeretné moderate, high, és critical tanácsadásokat (kivéve low), állítsa az értéket a következő értékre: moderate
NuGetAudit igaz true és false Ha nem szeretne biztonsági auditjelentéseket kapni, teljes mértékben kikapcsolhatja a felhasználói élményt úgy, hogy a false
  1. NuGetAuditMode alapértelmezettként működik, ha a projekt célként a net10.0 vagy magasabb verziót használja. Ellenkező esetben NuGetAuditMode az alapértelmezett érték: direct. Amikor egy projekt több célt céloz meg, ha bármelyik célkeretrendszer a all választja, akkor az ellenőrzés ezt az értéket fogja használni minden célkeretrendszernél.

Auditálási források

A Visszaállítás letölti egy kiszolgáló erőforrásátVulnerabilityInfo, hogy ellenőrizze az egyes projektek által használt csomagok listáját. A források listáját a auditSources NuGet.Config elem határozza meg, és a nu1905 figyelmeztetés akkor jelenik meg, ha a naplózási források nem nyújtanak biztonsági résadatokat. Ha auditSources nincs definiálva, vagy forrás hozzáadása nélkül van törölve, akkor packageSources a rendszer használja, és a NU1905 figyelmeztetése el lesz tiltva.

Mivel a csomaghelyettesítési támadások gyakori elhárítása az, hogy egyetlen csomagforrást használunk, amely a nuget.org-tól származik, így a NuGet nincs közvetlenül a nuget.org csomagforrásként konfigurálva, az audit források felhasználhatók a nuget.org (vagy bármely más, biztonsági rés információt biztosító forrás) ellenőrzésére anélkül, hogy csomagforrásként használnák.

A nuget.org sebezhetőségi adatbázisának adatforrása a GitHub Advisory Database. Vegye figyelembe, hogy a V2 protokoll elavult, ezért ha a nuget.config továbbra is a V2-végpontot használja, a V3-végpontra kell migrálnia.

<configuration>
    <auditSources>
        <clear />
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    </auditSources>
</configuration>

A naplózási források a NuGet 6.12, a .NET 9.0.100 SDK és a Visual Studio 2022 17.12-ből érhetők el. A verzió előtt a NuGet Audit csak csomagforrásokat használ a biztonságirés-információk letöltéséhez. Az audit forrásokat dotnet list package --vulnerable jelenleg nem használja.

A tanácsadók kizárása

Az egyes értesítéseket kizárhatja az auditjelentésből, ha hozzáad egy új NuGetAuditSuppress MSBuild elemet minden egyes értesítéshez. Adjon meg egy NuGetAuditSuppress elemet a Include= letiltani kívánt tanácsadó URL-címre beállított metaadatokkal.

<ItemGroup>
    <NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>

A NuGet egyéb naplózási konfigurációs tulajdonságaihoz NuGetAuditSuppress hasonlóan az elemek a projekt vagy az adattár szintjén is meghatározhatók.

NuGetAuditSuppress a NuGet 6.11-től, a Visual Studio 17.11-től és a .NET 8.0.400 SDK-tól kezdődő PackageReference-projektekhez érhető el. A packages.config a Visual Studio 17.12-ből és a NuGet 6.12-ből érhető el.

Figyelmeztető kódok

Figyelmeztető kód Indok
NU1900 Hiba történt a csomagforrással való kommunikáció során, miközben biztonsági résinformációkat kapott.
NU1901 Alacsony súlyosságú csomag észlelve
NU1902 Közepes súlyosságú csomag észlelve
NU1903 Nagy súlyosságú csomag észlelve
NU1904 Kritikus súlyosságú csomag észlelve
NU1905 A naplózási forrás nem biztosít biztonságirés-adatbázist

Testre szabhatja a buildet, hogy a figyelmeztetéseket hibaként kezelje, vagy ne hibaként kezelje. Ha például már használja <TreatWarningsAsErrors> az összes (C#, NuGet, MSBuild stb.) figyelmeztetés hibaként való kezelését, azzal <WarningsNotAsErrors>$(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors> megakadályozhatja, hogy a jövőben felfedezett biztonsági rések feltörik a buildet. Ha az alacsony és közepes biztonsági réseket figyelmeztetésként szeretné tartani, de a magas és kritikus biztonsági réseket hibaként szeretné kezelni, és nem használja TreatWarningsAsErrors, használhatja <WarningsAsErrors>$(WarningsAsErrors);NU1903;NU1904</WarningsAsErrors>.

Megjegyzés:

Az MSBuild tulajdonságai, mint például NoWarn és TreatWarningsAsErrors, nem támogatottak a packages.config projektek üzenet súlyosságához.

Biztosítsa a naplózott projektek visszaállítását

A NuGet az MSBuild 17.13 és a .NET 9.0.200 verzióban hozzáadott kimeneti tulajdonságokat, mint például RestoreProjectCount, RestoreSkippedCount és RestoreProjectsAuditedCount a visszaállítási feladat során. Ezt felhasználhatja annak biztosítására, hogy az ellenőrzés a visszaállítás során megtörténjen. Vegye figyelembe, hogy ezek a kimeneti tulajdonságok statikus gráf-visszaállítással nem érhetők el.

Mivel az MSBuild egy szkriptnyelv, ez számos különböző módon érhető el, de ugyanazokra a korlátozásokra is vonatkozik, mint az MSBuild. Ilyen például a Directory.Solution.targets fájl létrehozása ugyanabban a könyvtárban, mint a megoldásfájl, amelynek tartalma az alábbihoz hasonló cél. Vegye figyelembe, hogy a Directory.Build.props gyakran használatos, de projektek importálják. A NuGet visszaállítási célja és feladata azonban a megoldás szintjén fut, ezért az MSBuild megoldás-bővíthetőségi fájljában kell lennie, nem pedig a projekt-/buildfájlban.

<Project>
    <Target Name="AssertRestoreTaskOutputProperties"
            AfterTargets="Restore"
            Condition="'$(CI)' == 'true'">
        <Error
            Condition="'$(RestoreProjectsAuditedCount)' != '$(RestoreProjectCount)'"
            Text=""Restore did not audit every project in the solution. Expected: $(RestoreProjectCount) Found: $(RestoreProjectsAuditedCount)"" />
    </Target>
</Project>

A használati esettől függően előfordulhat, hogy a hibaüzenetben szereplő feltételt '$(RestoreProjectCount)' != '$([MSBuild::Add($(RestoreProjectsAuditedCount), $(RestoreSkippedCount))' szeretné használni azoknak a projekteknek a figyelembe vételéhez, amelyek azért hagyták ki a visszaállítást, mert azok már naprakészek voltak. Hasonlóképpen gondolja át, hogy azt szeretné-e, hogy ez a hiba mindenhol, vagy csak a CI-folyamatokban történjen, és hogy milyen környezeti változók vannak definiálva a CI-környezetben, és ezt vegye figyelembe a cél állapotában. Mivel az MSBuild egy szkriptnyelv, bármelyik funkciójával tetszés szerint testre szabhatja az adattárat. Az MSBuild metaprojjának és binlogjainak megtekintése hasznos megoldásszintű célok fejlesztéséhez és hibaelhárításához.

dotnet list package --vulnerable

A projekt sikeres visszaállítása dotnet list package után egy --vulnerable argumentum alapján szűrheti a csomagokat az ismert biztonsági rések alapján. Vegye figyelembe, hogy --include-transitive ez nem alapértelmezett, ezért érdemes belefoglalni.

Ismert biztonsági résekkel rendelkező csomagok jelentésekor végrehajtandó műveletek

Van egy blogbejegyzésünk is, amely bemutatja az általunk javasolt módszert arra az esetre, ha a projekt egy ismert sebezhetőséget tartalmazó csomagot használna, valamint ismertet eszközöket, amelyek segítenek további információk beszerzésében.

Biztonsági rések találhatók a frissítésekkel

Ha biztonsági réseket talál, és frissítések érhetők el a csomaghoz, a következő lehetőségek közül választhat:

  • Szerkessze a .csproj vagy a másik csomagverzió helyét (Directory.Packages.props) egy újabb, biztonsági javítást tartalmazó verzióval.
  • Az egyes csomagok frissítéséhez használja a NuGet csomagkezelő felhasználói felületét a Visual Studióban.
  • Futtassa a dotnet add package parancsot a megfelelő csomagazonosítóval a legújabb verzióra való frissítéshez.

Tranzitív csomagok

Ha egy ismert biztonsági rés található egy legfelső szintű csomag tranzitív függőségeiben, a következő lehetőségek közül választhat:

  • Adja hozzá a rögzített csomagverziót közvetlen csomaghivatkozásként. Jegyzet: Mindenképpen távolítsa el ezt a hivatkozást, ha egy új csomagverzió-frissítés elérhetővé válik, és ügyeljen arra, hogy a várt viselkedéshez tartsa fenn a megadott attribútumokat.
  • Használja a Központi csomagkezelést a tranzitív rögzítési funkcióval.
  • Tiltsa le a tanácsadást , amíg meg nem oldható.
  • A frissítés kéréséhez jelentsen egy hibát a csomag fő nyomkövetőjében.

Frissítések nélkül talált biztonsági rések

Ha egy biztonsági javítás nélküli csomagban ismert biztonsági rés található, az alábbiakat teheti meg.

  • Ellenőrizze, hogy vannak-e enyhítő tényezők a tanácsadói jelentésben.
  • Használjon javasolt csomagot, ha a csomag elavultként van megjelölve, vagy elhagyva van.
  • Ha a csomag nyílt forráskódú, fontolja meg a javítást.
  • Jelentsen be egy hibát a csomag hibakövető rendszerében.

Enyhítő tényezők ellenőrzése

Vizsgálja át a biztonsági tanácsadót, hogy vannak-e olyan enyhítő tényezők, amelyek lehetővé teszik a csomag továbbra is biztonsági rés mellett történő használatát. A biztonsági rés csak akkor létezhet, ha a kódot egy adott keretrendszeren, operációs rendszeren vagy egy speciális függvényen használják.

Javasolt csomag használata

Abban az esetben, ha biztonsági tanácsadást jelentenek a használt csomaghoz, és a csomag elavultnak vagy elhagyatottnak tűnik, fontolja meg a csomag szerzője által deklarált javasolt alternatív csomag vagy a hasonló funkciókból álló, karbantartott csomag használatát.

Javítás hozzáadása

Ha nem áll rendelkezésre javítás a biztonsági figyelmeztetéshez, érdemes javasolni olyan módosításokat, amelyek megoldják a biztonsági rés problémáját a csomag nyílt forráskódú adattárában található lekérési kérelemben, vagy lépjen kapcsolatba a szerzővel a NuGet.org csomag részleteinek oldalán található Contact owners szakaszon keresztül.

Probléma megnyitása

Ha nem szeretné kijavítani a biztonsági rést, vagy nem tudja frissíteni vagy lecserélni a csomagot, nyisson meg egy hibát a csomag problémakövetőjében vagy az előnyben részesített kapcsolatfelvételi módszerben. A(z) NuGet.org-on navigálhat a csomag részleteinek oldalára és kattinthat a Report package-ra, amely segítségével kapcsolatba léphet a szerzővel.

Nem találhatók biztonsági rések

Ha nem találhatók biztonsági rések, ez azt jelenti, hogy az ismert biztonsági réseket tartalmazó csomagok nem találhatók a csomagdiagramon az ellenőrzés pillanatában. Mivel a tanácsadó adatbázis bármikor frissíthető, javasoljuk, hogy rendszeresen ellenőrizze a kimenetet dotnet restore , és biztosítsa ugyanezt a folyamatos integrációs folyamat során.

Összefoglalás

A biztonsági naplózási funkciók kulcsfontosságúak a szoftverprojektek biztonságának és integritásának fenntartásához. Ezek a funkciók további védelmi réteget biztosítanak a biztonsági rések ellen, és biztosítják, hogy megbízhatóan használhat nyílt forráskódú csomagokat.