From 920c2a2cdba664e63eb905f3c904d36f4a3c7d61 Mon Sep 17 00:00:00 2001 From: Nikolche Kolev Date: Mon, 3 Nov 2025 14:42:51 -0800 Subject: [PATCH 1/9] Add updating vulnerable packages guidance to the docs (#3493) --- docs/concepts/Auditing-Packages.md | 60 ++++++++++++++++-- docs/concepts/media/dotnet-nuget-why-1.png | Bin 0 -> 39056 bytes .../media/pm-ui-transitive-tooltip-1.png | Bin 0 -> 20133 bytes .../vs-solution-explorer-search-options-1.png | Bin 0 -> 7508 bytes .../vs-solution-explorer-search-results-1.png | Bin 0 -> 25210 bytes .../errors-and-warnings/NU1901-NU1904.md | 2 +- 6 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 docs/concepts/media/dotnet-nuget-why-1.png create mode 100644 docs/concepts/media/pm-ui-transitive-tooltip-1.png create mode 100644 docs/concepts/media/vs-solution-explorer-search-options-1.png create mode 100644 docs/concepts/media/vs-solution-explorer-search-results-1.png diff --git a/docs/concepts/Auditing-Packages.md b/docs/concepts/Auditing-Packages.md index 9ba52e166..72821f43c 100644 --- a/docs/concepts/Auditing-Packages.md +++ b/docs/concepts/Auditing-Packages.md @@ -16,8 +16,6 @@ This involves identifying vulnerabilities, evaluating risks, and making recommen The audit can include a review of the packages themselves, as well as any dependencies and their associated risks. The goal of the audit is to identify and mitigate any security vulnerabilities that could be exploited by attackers, such as code injection or cross-site scripting attacks. -We also have a [blog post](https://devblogs.microsoft.com/nuget/nugetaudit-2-0-elevating-security-and-trust-in-package-management/) which discusses our recommended method for taking action when a package with a known vulnerability is found to be used by your project, and tools to help get more information. - ### Feature availability | NuGet | .NET SDK | Visual Studio | Feature | @@ -182,7 +180,14 @@ Note that `--include-transitive` is not default, so should be included. ## Actions when packages with known vulnerabilities are reported -We also have a [blog post](https://devblogs.microsoft.com/nuget/nugetaudit-2-0-elevating-security-and-trust-in-package-management/) which discusses our recommended method for taking action when a package with a known vulnerability is found to be used by your project, and tools to help get more information. +Getting a warning about packages with known vulnerabilities is only part of the process. +Once discovered, action needs to be taken to remove the potential vulnerability from your solution. + +The easiest case is when a package you reference directly has the known vulnerability. +In this situation, update the package version to one that fixes the vulnerability. + +Package vulnerabilities may be reported in both direct and transitive package references. +The action you take to resolve may be different because of that. ### Security vulnerabilities found with updates @@ -195,13 +200,60 @@ If security vulnerabilities are found and updates are available for the package, #### Transitive Packages -If a known vulnerability exists in a top-level package's transitive dependencies, you have these options: +Often a vulnerability will be in a transitive dependency. +Our recommendation is to prefer updates to packages “closest” to your direct references. +Though, there's nothing wrong with just upgrading the package with known vulnerability either. + +For example, say your project references package A. +Package A has a dependency on package B, which in turn has a dependency on package C. +In this example, we'll consider that package C version 1.0.0 has a known vulnerability, fixed in version 2.0.0. +Our recommendation is to first try upgrading package A. +If that doesn't resolve the audit warning, then try upgrading package B. +If that doesn't resolve the audit warning, then upgrade C directly. +To aid with this, you'll [need to find the transitive package path](#finding-the-transitive-package-path). + +In summary, if a known vulnerability exists in a top-level package's transitive dependencies, you have these options: +- Check if the top-level package contains an update that does not have a transitive vulnerability and update that instead. +- Update the closest package to your direct references that does not reference a vulnerability. - Add the fixed package version as a direct package reference. **Note:** Be sure to remove this reference when a new package version update becomes available and be sure to maintain the defined attributes for the expected behavior. - Use [Central Package Management with the transitive pinning functionality](../consume-packages/Central-Package-Management.md#transitive-pinning). + Note that if you pack your project into your own package to share with others, [CPM with transitive pinning will cause packages to become dependencies](../consume-packages/Central-Package-Management.md#transitive-pinning-and-pack), even if your project doesn't directly call APIs on that package. - [Suppress the advisory](#excluding-advisories) until it can be addressed. - File an issue in the top-level package's tracker to request an update. +##### Finding the transitive package path + +There are several ways to find the package path. +Which method you prefer depends on what tools you normally use during your development. + +###### dotnet nuget why + +On the command line, you can use the [`dotnet nuget why` command](/dotnet/core/tools/dotnet-nuget-why) to understand why transitive packages are being included in your project's package graph. + +![dotnet nuget why example](media/dotnet-nuget-why-1.png) + +###### Visual Studio Solution Explorer + +SDK style projects also provide the full package graph under the project's Dependency node. +It's also searchable! +Expand search options and enable “search external files”. + +![Visual Studio Solution Explorer Search Options](media/vs-solution-explorer-search-options-1.png) + +Search the package name, and it will show you all instances under each project's Dependencies node. + +![Visual Studio Solution Explorer Search Results](media/vs-solution-explorer-search-results-1.png) + +###### Visual Studio NuGet Package Manager UI + +When you look at the Installed tab in Visual Studio's package manager UI, when the project uses PackageReference for package management, it will show both direct and transitive packages. +Currently, this only happens when you manage packages for a project, not for the solution. + +If you mouse hover over a package in the package list, the tooltip will include the name of one direct package that has caused that transitive package to be included in the project. + +![Visual Studio Package Manager UI tooltip](media/pm-ui-transitive-tooltip-1.png) + ### Use Copilot to update packages NuGet has released a Model Context Protocol (MCP) server that has the ability to update packages in your project to versions that resolve known vulnerabilities. See [Fixing package vulnerabilities](NuGet-MCP-Server.md#fixing-package-vulnerabilities) for more information. diff --git a/docs/concepts/media/dotnet-nuget-why-1.png b/docs/concepts/media/dotnet-nuget-why-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8422c44ef4d3a7cf8a7f9c44bcdb570b451245f GIT binary patch literal 39056 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 literal 0 HcmV?d00001 diff --git a/docs/concepts/media/vs-solution-explorer-search-options-1.png b/docs/concepts/media/vs-solution-explorer-search-options-1.png new file mode 100644 index 0000000000000000000000000000000000000000..870c39a8a3ac3f95e45fe13ddff010a5cf04f5a1 GIT binary patch literal 7508 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 literal 0 HcmV?d00001 diff --git a/docs/concepts/media/vs-solution-explorer-search-results-1.png b/docs/concepts/media/vs-solution-explorer-search-results-1.png new file mode 100644 index 0000000000000000000000000000000000000000..00e30fedd7b5e3d2c945b37fa663183714d48c3d GIT binary patch literal 25210 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

I&wSK{;AfL6%_p_=n+@6&N=t)ODo62= z{jts^A6sRC?u)zZ5z!Z!Ql~-d!tABnF$cbKOfCK(=r0MmMfzAmzHg3EngrlOBoi-BSGFz>0uxFJm$JISfj3Sb`b@dQJ3NN{<^z$)8 zWI4CA#c+Lhrti!6Lj$I8!;&y_L_0nSkDONDWjeAWemxo?D z9}J%N7$2ZRH12=kK(S&T&Z%h(k}$Sp$^>2J*QjPi7u4o&6xF3FlZ*Js# zWOt6tTPD%f@3&!{Wj57=y_aSBR=%2^6&d(jGcseMkKThgiDIUC`FLjHkXp8%t8fue zj?Q?%QpU2rGHG0gUNCcvad7}-7~|TRD7$6s83$Rwc@HavW?MWdp);f!)gS5YapMA8 zKf^5mVK>EcX(fq9#@qZ$18#52-j%)AKvq={O)^;%p*UUnLdiy36^tB-9a3ZiulFBY z;zNBsd-D57&*K(2+>%K(4J9gyl>#hGYaO^r)+!c!rDp%Hh-uwia~xOwLl%&sp4b~1 zZDs9VH;TSRQ%392edNl-Cc3e<;hU(a=cq(T?Obu;vXyw)Rc2Nu_`jdLcgb|eEOiW- z6qB`M>-T8#bxhKgX>!`gy6s)azjs`*;t1Y~Kn3~Jr$5EK8xYfof&2(4MYXLkfO@j) z%Yd^pfT3KApoWJ_8-G%lOzB609mfvxR2t-*U?by%R z*GdhqY=BLaX>K*0CPJ0rjX{>4J{udYz`@?QU$oW7GRuN~eDdkzUB!rO4cCdHA{aNf#vxO5#j zEo7sf#}b$PG}aM^Lxd_5XRY^yGcqT5q8H5=G9wL(s^~f5XH@Mm$HYrjN!vrzkr59s zR*bRWQsianI;ynnIrb%R=V``=AaqI40ft&uJ+HwD`-f?sXo4M@$-0{jx|u!ey?c&& zA5*OEK7}|fKcGnWlD+Fy=%Zk&YisjLJDX#Wa?Ny2%1X(;{An*?)J^0d6yrH-I(=Id zq1D=XM0h4)=tTp^?Yvu_kwfBMk&o=6=hx#3uYI4g9s64k2D>Wk+aNeuF6&VhCMoI% zD6t)&Z1#z(B#IPhH~jd5azQ()^oWGrWPC`y9z9;?QY0sUjaB`Unm{Z?F0EH;H8OL8 zX9Dx|_ygPhvztmkTy}wCf(0+VX|;qA65P%-7E;Y{V8ho$VeWU-F!36uiSn@3eUg3! zwFyR<{l&}C{<1zPSJFcJucA+9VuIBwl5~-_4KU-~GMSbxCbe;cbF)c%B)GWqCB}M$ z&EbmLVQD?Botmlozkn8)?7R4z7ii+hn$%7+xIlovKnBp`8 z04ir?x-}8?ADN9YaDo&No!Fm%wCVqg(l#)cCaqDf6*2-J@%?WyIneO{@}OSa)kklB zz$HunEATNxEQ2Q^G(k>>{x_W8y#E8|SLSJKd1B+k#`Ds)-=rwJmI@pumCLD)GJ5s{ zCf;YJ?JhTEKbEN9Cf4D7?qsPee$Q4g>Ugq5m$^}&vFSalOTlu{zBf>(npGHNX_7^b z*@_Q1h5bN)pm_trr~WzllmVT?%9k~(?|zGfdf;^a7N;WiGo@K@k&myd%1wkWJFxp# zGyl2{pP=8#^u^UGLLfrQU|^kY&n* z1fUV2qW~lLG+O(e`}taidG6dcX`NoH9wN8nY%y3|;tkO!{z3Fks{cWBYyhI?)~{&a ze3_1!qRGu%O~dx~IxLdBZt*6@n~t`7Yx_Hj&w>&wV zmrCB1aQUF*;)nb5<8*cAh`;PodJG~lprps+0!I62v{%3zJkyA9LH)6B;yYn#)A3Xa?h{@e)2sPHn!^u_6hQx<{d;I) z+u6J$?QcYn^nQ$c|JZzMQN+Dluywyj!%05z_0r7dwr?Ki7KbV`}0>In~l%N^ugyA8psS)aMKP6L?8HoSvb?#wM)`FXpH_b`nJY)@sP)H$`PdNbZ3AUzPl z{-85-F$u7W+Bp~R(r{qQV_mS^UgRp$Ja*DD0eyXO$glPY9S0W+pbOjU3jjS+{-daF z?C2}fKcN6{N(W{j2&YhaQU4DJfBIh#j@p8h)Hc+{PsGmm_z9tZqFEmH{`@cvA{OCD zpRxgLw>&LfSvnaqzXm=|xxw~Jh`_|%*%M7VOUE=sT+$3rA44lQpbF6dvs;mYlw`4g zf&sXM?n=-U*jemL#(DW-JrP#t&b+OVyPC%5GnA#J#N=Z6|-Rph@T*@`nAEk!- zv2LOY|9~&5@SJ9RLp}P-#u@d*(hhwYszL_B@d+G@Xw_{nlTL5HGGA zEB*idH3gMK<-5aw(0A?)eNh$s%J7f4*|MMwLOcy3tO-J*w3%En;_W0>Ze5J(y7SF; zC1%5wKj&K-%euud1^fA3ww$QV6TXw3D<=ZR)$%sV(B%v!4QGeY?jxM=g=b3n_?iqag1meXNY$0mP)+J>2+r-#kEG?qh(UT7;>kba8 ztxQuRjQ&gKp(9?$cvjow$EPu84X=oa7**xxIAKBeuE_(hTmTYJkpF|k!JYK%VEEm? z#dsIH1oDm6ml`2~ntJexsm&;-yb-%QhbjQ&M3en1(Ih(lj`OJ}^nWFo~6j89vo zhKa$WlYhaKF>n{y)AI7z|2;4OmO=`ElN5bU|G4cy4EF+j48^xto&WUDQb4{a<@kNp zc6F&c5}*sy3X|SdrGIC3B%=BQuSF>Uz_J?bxC~LL&S=^6hj-|_s)7H=$P4xdkVkNU zg=0e1w1g~<*c)&2=>@&@`MzfwlOkw$z8w3iA6{VYqrTrB>&x@zt6t4cbKx$XRt1$* zAwmPdQ2%Pvvol^L?4@I!szzJBW0(CkQAld(aS_MwpoS|T?|J=%J-vYofv8g4|3r$$ zxN_m}^N`JE8ABc8>+Xlu>Vx%}V;e0CHhWe1`fO8cyN5T&H$DR5LCiFrla^*SB5_@* zJN>)u$9oGIA%Vu{mwrgz-;KuyJnyDLQ9^yBZnq`M*b#68a=vIf49tU>j%k& z3w>oPy*M{{rP?%~fU85hqD11n^sunTrn)GAG+)!GDmMx`y5Ziby_-XmBz0-79^vn? zCn;hxd~JT4qBE=@HUB#^x_Xr4JCseLz^_O5F$`b!aOG&>B$Xxp*z~3ZW<;w$j?f4% z*eU2}Czn)&I0m=Yg-#NhRt5?)zrOzwwx!RZk?+wsexvd84f4ka@b>%jzJ@Rs+FS%& zj_04WLlPY{PDHpYcO@o%Bs9yg*%%R5>NSb5Tb0j>`>Th9@%b|yK9Cv5U5k;)d+vJ0 zvUn0wt9V4g6P8~n8gv3JRr;z1+xN zu{{{Y`SGRGgg7uDiZpLYU3tmogs?HQ%b$CSkQvF{(kP{Y^t6u&p|y#ADkzCdaN*3k zBvfb1p>@1*$`tIS(=UyGsXUnfJrI3^RYh}O0HMBbFTwF02}~R62bQ{))-n#0-7E}4 zQR?Gca}5ZPNubMYPGzHFKr<;Ynxxl8kl7edxlpt{8hJLhpSF?jd7iY>`O(bExASh% z!7Tk*psKoSjniEl+&C-7=YuQK%QpKdjhZ%~k?n8k7;kIyc5!DFmPE3iDH_Xd`RgIya(haQ_qC8i4>Z?`_gG`>n0jwD$ zovAT-**|h|Q$9Z#0fRMW+^8@PweS>BE+$|QA0LU^ouf1|%1z@av)_7>K)>MjCr6j&0b+B|b;pm&4mibf}nu-I^nun2h9s#02wCN*1^aJTt9 z1b7-2QoW-f09f32hHCxrccZKz0N;W?K>YjMa0-Bv%m*WF|M8gv5K+3J{sW|3 zRJ~9mS>)fQkXroCzC5hiwUA-JnNxufvHihAO@P>A+}8(vL?+l~z2W~v-+49EQ}P8q z^(~fb2nHVxz)N_`daU}2|G~pBA*j)El@Hq?*#0H2osVNy(>fX^cG9uQ#Ul=UN1AM& zwRpeAD}>q%537pUj=N3vxTq20>?Hb}k*}8s1gBs8Jyc#-TFa{M=frt?C&o2 z=c&01wU_!cW`V@aEYo8Yk9I6C8DJ7;cHBcrveeY0VV&CM+(N*o1LNii9{X}(-^WaH z{~Xbvf2e0Q@AdZ`_R^?EH}Uc&ePY94`&DY5XN3$NuKDvJvg?ICIR~JN!{zmu7|ArQ z=7oML`W72HP<8}s{1}$G)knQjfF}w>SkqNIgYw-hCuKH0j>0w*bHbCnk?bVh&CslT z=)l+~p8`B@dAjwn#JOQP?caN@CKovsA>X#};tb&4aq;5rc*}@t7j?F6i|{rR)(k27 zq|2@?1EcJrTWM60;-WNgiB&2q{IL}~lc*nc(8vdyOaQq73aorO0fqdeyKXj`;>*hc zp37^Q9>G-+#tHeLPDgD!W4cDw#j@R*$)GDG+7rxXlV^= zQ!VUKZ66h$)gLJ1j943MC2+ZE&}geSK0zfcGj8JuCQ$BGBK4&K2?dPF{sh3uz2y;Zr zXgJYFIcSx57saXgXfcTJEk06s{NsPSq-eCdA#2923rp@h**se@7#%66<`aCel}puf z@S|I4`4J>d9X?bvKG#i?F;sq)hmyLwZ0hyNd2+{jwdJQ>^#LpUjn`8*CGBFTb@b#G z1B*q&@K|LK0P~AwZn$`SM4<07+ag-T!Z}I&#N)u#_Vhi+#OjB41`>#}0n$AE`=!h$ zU2%PKd0Fb+JiUVzH&JdY-9{HXlk@9Yuc|b!Wv$|~r;Wr20c-TvQS?XGtRV#U-6P%jNEpez6W0>PyWFAEp zd)|<7;3GT5$7qz{f4g-u+4?_e$?QLVxw39OK$=uqcCb?TIG=s|GwffBypp-qs$tL5 zTca(g0DV?7U*ORd9X|})P2x#SMCNu5gdkqaeVp8s#vACi7qs+XAD++gilQIFs7iO0 z0*rfQmNkMQ6ZJ7W+Z9A;N%`v8FeY`pn(rWtCxTBi!{+lycWy>`%f5(TbCzD>4cBy| z0*!X?FCH$99y0L7Mkba|>3}N!{M^hP%MnUY3x-8^EWiPI_gLrc3UT8{wp!mBdbIM@ zo=q2pl;;{xX`by?D?KSFr6ZUl&{XbcpNA-{4fktx>!?c6$}dfS2h$YOniO0JN)3{w z!dn)qS08}b%M5bXVj=%HQ7;b=I_hELELxA4`O6&W1J~yi2>T7z-KZ+gsfTqOo)?wq ztEzXTRE*vf^5nEv&p1XrTMk4OwSbpeg~fvM4I3JDB_rHZV4PLH{E zSct!%m6*@&g?u z_=<5m+7|A6m5dbiNR$P@nw78lbDk6Zg>~_O5agHU7>_Rag4jtMm%Ve$iolYp>C;%x{&EvX8REoMov97w+r*;At%;n;8rGH$Mx1(O@= zWoG!NDkSk2WOeeHf?!3S$gq?ZyjE)l<3d|?sYl!In}5Le8a%!jS#wQu>jE@ZZYo56 zy+^G4r+iP(D(zQ7QL4GV$Bh2|$C#&Q-Uu4HP9a_GPj&Z*PMs2TD=hX%=ZNMW;##gh zx$pC|US?wNtNh&g-mSJ{J(b3YRZi(+iMY29B@wmRn?$j$M57M1NQmnX1X&afhj&uH zER1;vJ!soBt=-N|iRhW0_&>*AiA0qd0JRA*pf;hpGZJ5Pnow$NF8y60lq)30xBrXy z(gZ+1)Q&vkD|+R`?V77u;Pup-6)1~74n&NP&WQb`7TQman8{AIVD#Bjys4oJoMYV= zzPj`H{hF3q%u`0o(46ez3|6!o`#Ddu0(|wW-MeHL3-{|xwub4m;zN3{?jtG8$*kN#krlhej0Mj8l??_)8J*;bkWkSwm z-o_fMX~O1V_dR!T*_DfFsGzcC8Q|*EW_6j)`vZ-KNKxGLnP952Tv}{xQTk50Z|TvJ zgN%&T5^z38@G5FGIr~-QZWHxvce(;Wpt4v85rVnPMRZN(ojtVXeM}D-U%1aYP6%^3 z$Z}3-bGVf`j?R?ZIBCYs8YmsVSH7za5ECJJThqWsWFR-(o9gQuQKpbBoJg=>zcHc&fYX^C z2CXe%tmM%X=*NLubdj|2tRIKPyjaDVY5*1;q^jw=K0JPv_CN7zZ=3$KAm7wlR;<8_ zrV0HTv}1|=>`8noythJxP<|pfQ9rVpe`pl_;dD7{rgY8|gxT7KerVCY^**l00DFT1J;K00M9I^>^nR&P{3?DH5Nx}oWtLw(Xf3wk|`0F%xyZidqTWDz2UUZf1 z>>=#V>pLtDV&Myrf+~LpM+*#wpOp*PaC|)7A`aNN5sF*M$aT-J9jA(lth3XB=f6A3 zoUMWz{}WjZ?Hku;!x?lslK;Vjs`t*P#(0+wJ(;Lh_lfThMMg@SDoKAJQM*oLE zG6vcLv@J#W@Qg^Os3yZ&dr z2z)A#Wx5~Nt2m9R-Q2G_Y{hWAuwHx4hZO1DCRH+3S~*EdsjG~EoUo1zX`Dh%P2bV;Og)kv%-QkHCX0zz z{6B7i5&3&Uhvx8XQD4`OGlxPKNejbkQ&VHU4EhWa^W@+bt5?m;vYDjsnB%uXyG`q{fpV z*%4v1kQ7l9u#w^I#|?C9aoHN>b|b(KnmhYVpg%A>;qq}0|*%K zqzSxsbGKDoWv1;Z4Boh7s5zL>TIOAMb&@qvhK`D`kV>8spRq%rLuxHq#*3P@H6?ej zYIFfhJNen#hJ53fBoWK4OmGXQGx{@cNs%M5nwf`6nxagL?`E)7tD)^=ojWn!D-D?K z*WvS$*O1<%Sx&tXN*7Bv@0(zWOWk>tTrCMeuJZ4~B?bntKXOp(@vu%rKUX89MRMlR zU=+5~%WtpY{bUEqdv!p<5wKFQdJzF}2ckl0-^rc^5n~HZfONLx>09V7a)?;6-9I8w zgmSd8gcuK;=yLF}9AZoVrsHQ_l}}gC%x4{KU97AG|HTr?D$&0FD49&%0T?Yvk@Auz zA@(J%1L&|DN*;{{Y>m`e-~{nTk=HO&Y1Yyj2Oi)bLo3sNfm9TGZ)rBS=wSx+*HKZLC9l@#DMB+yrvG-IxK@zD^ma zF;n`C!Y@qkf*%It1A5Qg*i$QTZGnOucyHV)<-8tCJNqFcm!x0z$eByca;Hv77wdDyqykXP`{|3o^cXt90(6 z_T==Z!qI<=V6`nLOu9~knD@u$!#QeYpEP+GH-hZXhPL#57A=woqiRf$Gm6JIPup{w zE|X!(24AcO14uu_+^zbXLLcEN_&SrvR7oPv83;qYF}ap-UM7FHv(Q-=if<1?ss3G6 zd=o)SgB2jeX0U)>yWX_mz&Q|az?P9Gj^v!QCITaK-MJ?0Bb+4fu@dj{2{Y}4Jrv(=_O{NHE_fMKaAC+u$P`>5SD9Nx+rk-|j!Dt*HfcpAvkHVaI zX{*f8Ou1DIiqZQ4((?byrmj4xLP#qAKRRWJ7}P9gW`v))7|L%l%C?jp^_;d=Ocg_v za)zCiVl#l#5pz(HA8ymj3)N0ErVhR;52e&Yv*i2U@2L-j5}r1tR`t=_XjB&D?QRaq z27Z)ZA()dux=c?Ob?oPtK3QrjFNg3FuPnZdcwDa3P&yrsS~QZqn1aDaf_P2({)`H# zN4j8>x)V$uT$t?D_eYkj_-@|O34gE|BY62=LfeQV*k=R(wo8!RAM@V~8Z93ia$g{b zpO*JL6?m_o=JTl>52ppTXCyit0bvH6<10{fO=^h$Pi^z=BH6LyC^*Y-|2^>dy^GN? zzt)WJAhs9!^G4j^TjrzHFdqdbN+UtQ=K(tJ|5VyaLYOHQ-;9)6YFJJ$!DSGwWR=OF zzYbJ97ep2Uia#8s%YGQ!-_<HJg0*bEU~{7|OUh?^qkibTWO+VV(2x(> zXvecrxwfSf1NcZXYA!E`Rq}n#SK97(VQAAaO$-ZhP0o*%T%6gB89h0`S88$Ap8e~WHcGRh~^w8|Ec{T0QdAy%}=r&e5_r91o9?vm^txR{m z5j00!5r7aF1M;q;(3hp*JGBkN^YlGXOasVHjJIpB5(%I6+;KC`pWfqfY|?IaA8Sfs z0fjUqI}_5z8dc{2(Z%A*s^%r#8ec;Hgx6U6e&Ag>6m}!ae@5yu-NK#2C2*eGDvlD8 z$36{3*)0VWVlbG3MP-8c2x9&G&CouhbZFY;ASXR6HZ(l`;Tg;h znJ@Z-pO;9mt@nWS(gxpk)fZGMJ4m%jyUU9cAx2CORcSc$F==UzQ*Vudp%NJ4AvqG) z>$IHbw8Wl;S4EuQvy|$yQAL7u>wz3_g_OSzWSrQ#!evY1{3uZ`a zXn4qn{YSybO=3k%Kf~@X%e8CFHNT(YzB`$lp?rnai`ZS)eEa)$qAEr_&3DCyPBwu1 z7bK}`MSd=NBPw%MSl2WCpcvINW4E2E$4liuu$(L~exysCPX1A#+(lG=N zDUx!4Y4T;7M+hI+Y*xJ{?|pxh6OEV*HklBPv3U9cQX3@AXpw8x=(kh}5?(t- z46;!kV}L$ebgDzr(d-!Y{XVS1cdjU+At^x8{yT6upQfKc@+tpW?;$-b^yW}W>%RQ! zPyq-@PE}(UF=R(b=DM%R0=~TDfDj%W)1vDL#<|6?lACUkBQ^(5d-{8`=Q3FAC`Eac zxsI{o-IR{6E%(4%p#b!qqVf5k5Zr+LWn0c&+FF-EHF-j)EP%Cmi(Ib(Z&p!Fjv|*M z;6PmR&8+~Va2ZuBR7y9iLwL!L?1VPPq!qK4F)Lv4LOLOsvDx347r0!5ofi?Xpnl87 zzOgtxSIE#A(wWbxqD+m)Sv+_Q!yOupjT5lyjS*K6PF7V8A6VLe_ojh&Ua6Nka>XSU zRr)_j1w`e78?V*-WO3n|%*^b?0Ej)gT>EWTmY8O%YTtI!CwvU@ujTxH9aQASj6EC1 zk|6Ia0r!B&h?jr_tOG&|%XhiNZpqJA<=QLXwAQ)-oX|OaIH^cN*2t^yQdeZ4;8sbA z+yCq1D#M~`*R@~((jgKuLn?@XbPa-}bW4MjfOK~W(l8(?-5rj~AVYUEAf71){l3scfI#>7b*5{_cfBpWP0{1%X*m*m!Qbj$CDnU!@aO=M1@lZ zK?bXVW@L{TJ+8cSoL2c@P@V(uo&S1y^O{mncZGXz^e|>Wbb_7F5a!sEETO2ZEU&xX zb)dEfTKdLSpsVkIk+A*!D9zGvS%-I$UAH&r8O$edVzRfR6yF54?xNx$);XkBo*}!< zJ+}XG_`Ns-xB4L4(ijx4B?JqZtry%T?rX4HWoUljC(x(tZ}rhI`H;0!e~&3HzB{Po&C6lb2(Mfa(%zd$c$T)$LJH zT2QkId4r0^bC1i>hEx4~jF;tA8FK4ZbD9$^E7GYUUYNzH^iIrPpYq81K>T1Q6*Sh-h==Bp^SNUB3Tcfr?p~rt4k) zrU$CMcNJ*mvGx7VR`yp+iu|r~&D%vU)|7W)P=lD0c7`Tp8ZXRHf-44)?>F2D1NVjk z5ZH_lgNq&HvG4qI*o(VTO+?l$+WCKpZncs8y|c_cOM7tYVK+tLYvZd;!~A5klj$g& ze(FF%_6G1Uzqc5DtiwwbSKKggmgoj0^~f#|p*=yi732Kl0iqg}*d7F3(PF{=X0T$b=g% z!o|c>`)?q?_34&qNLtU=HiS7%AmP>A0D==a79gs&n^?OZaRERIS^@w&v}1&q0UL#3 z7mVh!FmSvvH9ikKV{E2NIm<`-a(H0=n;0pv-__q`Sj6~4!mQrF4Cl5_-a7gJi5aAX z#6jdY3=FLZ099lOwUSbq?tnxOc^Xfyo;X}=`R71W@II;+8MfncTq>YFj}k|+Ybrax zelR-cd_8*Do7Gw^+UYU9a~dOazPSVf6#z~(lyq@WX1^J(+?$n1_P1lP;XT2x4FY2TQiBQxJ zad6P*$=Wrfr`yes(ofng>EnJ20%F17FptQ_Pqy0A+95Uf>w{HAEI zGxYiAN)px%>$wuYwxC!_KXbR`)dzrS(Dhx1xdJWgjSVVsBy%R{@n2`0TW75XS zIVh!U$388GlNsv0XnQ~E<0yo#(P6Lq#MavdIAMD0ZPEH{Eu2s^{uSY&c0E2>A&bv^ z^5SY$`iMB6u;KlMoK(6;17|d#hMjECV>)Dnar$EZ4^r@$jVU}1R3NT)EmSt=*}%%@huv%*`q*c0 zjfsZ-sAB~h#%$@N>8f^o4>=6m&kj&D7ui1Cc6v%NSWrAajJc_6yw{MpplaK+&j(4Y zusz(n+K%h4u$?$Xf1h4xDhE&V!MAo!c9xwm{LzQWQM^o3ppFk zklGXZziUd`pSj!%?0Ha3G+-59Yq~8O@-(i1+#w6B3wDy}Vr*@Ep|BItr53lCi0-!L z5)953;OYmBcmll}I?@3mv^snXzaY~9DrwjFFQ}xw0zf4!_nn<8C1>)YPsdEN0{tzj z7SCvr-IlM|UlpWXy!!px2BD+Tcr8a3P0+HY*T`-Z?0UIar~o3~5AgZoOI3BHdtjp< zv~_~6B?%$&Eyp*CE=Br?Tgmw@x~F)mCzHV#@C#|Q@(zA)j617de0yCDG6=!~sZTTw zQBmw2lm%*vLnZl4706oOJ@v*4WHzPk$!UC>uH8U*G@D*b_S>DT0N&&AtD!#Lf!xV^kh-~|7T5`Cq2&Gwf zzFFOww2l8NCFJnSu97yK=h$kk>nflX$oTkMe-r9$9hq=?otxcOtW`@+Av9^J!;qUX zpz|yI_C}IP`|4mUU9$21dlq8~CdRK)wr`IRmR|rvo*65U?*bBe7Q^3JAV7}-gBp!n zIM%}8F~PLU0o(We(lQ4NP2O$mS*mIs?Q(-5kZD00>gT~u_U{l@b84i;egMipJO~+C zjhmV*p15kT(H4%c)rJm%xk>K4@{qkBOqf6Qtx{6-A&P*K)yeil8v}e9_RFJ5I~L)L z9h6!xa1r%bi!|{RB`mOqo7k2{myS)AP2bAQT~GW?``gv@MudfgZ)-tuu_hH56qT!Z zxVr3gXj6zNC9l3m)vcZc*+gQj+>b)JQMRp24bRTq;}6y4I*!{y}9t zu^W+l+28O*NA7y0ffvfU=;V}s!D!HrU@E=c!&~E?CwXoIK7#v9|?a~9pxXJ5yvx9n3e1D%jW?- zt#UHZ2nZ6*8Tjlk@9X1ZTK^=B#RaZFkN@x(jlTsft3M8MXlg|FY3h&5WFL9$Q&x2E zpDhG?;Jiw(t*^sksNoCiD2~7&DR}oflOEbD0kp=w#RjwdGJbJKmd-9n57g4>cl5nw=mSUs@CE471|>)C!;D znqWGM1xP%1zV)f@4`l&hl-PlrEbAqi0-q5v#O-gKbRY?gC7zhbnSU6Rx0vSA;g%)~{PSWFy@{f1aG5((G?pwV@2tC-1tW0U)T| z0>IG~)qH{G3a>c^x1+s|jCMnf&{W{sbt?Tm|CuP!U#B(NPS)+LBHRkzuS0LtC?YU$ zurDsPSEq=bG`!NxUKB)QbaQOYQ)@$kB^zMm~%%J&YnRQ@07O;NL z1TgEdU0W0>S?jfNF3&goIijJ^%Odo$faFv3%t_|0vB+wGW|5jo+52cJ-$+vJ2(*vx z>nV4VJectGDzj8<{bjsFf=?x%>-BWWAmaTB=&Gxqp)oVQ%zQ_9ue?^eN$KEiy5d#l zru_iMow1X?k+N%+Ag(L2$}3oZXZpEed~)$J$@)uU_ilPKxM0ZiWL=`35Ok?|@K=fK z?i=2HMdzHcoSOCH3eHN~nvGPyrs|ERRa&N3-|U=yZFRi0Vt(Fo%xyJScoTzDk4BPu z)S(??b>y-^{Hu?2=y~y?I{eO5Xpq;(+T%p$Gjg@OoxhAuhiP6u2&6xo z*TJ?>9OZo7?KFqCpD`>DRqYCgeeB|E8Z)06?&#gGe5q=QEo>;ad7e^XcYJ(o8X18D zigg^Sn_}}H!*fcL*hggE1U+-4ls^``N^H6F+@uauQnw{qwpSVb{CTX_F3fH-`r7Dl zk%px;Px(R_P;G>J3kC8Xd0(k#MdmuQc&;;S{0HW)sv&;Pb1ywJ@6TOdlkTT)_|HPf zlru)`y>jBaRCeD`6R9-f4A&G7FBK|ORK8z5xw95MrZ+@O()B62=xppMY*yq*Zy^m5 zGOS{60w94z=~czP<4jrdH4UX`LUNL4efXA9y_}!azr%v*P^XLD3=m+}ZUAw%x@& z$d-|eA^OGgbyN>4!dH^(fM`W>!!?ZRY5h zW=4IB9f(P0=A0*rS-m8HM)ddVrUXM+8>>Zq;H@f zDT2x>5kK1ba+NJ+`fYP}n(U~jptfCfoLRt}A{^j1lJbpHTVP5kS8$U2XGF#doKz|F zu|%8Cb>we#HlTDT8ZVhUP!O>2 z_@lk$?d{QR>Zcjn9$wK^x_&=ko)^1w2^t5hTn8@-(vWQFVq((z!LUG}O{7-^wvG2z zJhyO*@ZrkSy)1lL_llh`!D-IFyH83sfrh(4xdJ;N)4V+kUbxmgbf}c!AEtS*#r#`S zzuP-FjwhQZ>{1jUIMnPNd(BjOB9<=9o%nxz@=I@HCH<|xk{FVB^p;xiv1wEu`4!p2 z6NASm)eW}!lgA|Ie8MUUmx=F_NBq5r2f#iT%$|;DXvocf}hd0MHgse8K7mx@T85ZxWhIH?gDE6vZ;8a z@46xjKowFfKtGGgfLO>A`pKtv%PE@Oet-Yd2C!e5PjB=$g6N?kp z{YBrE4^^#9ERp(93a+rV(k-HN8lALE1F}XVsWoDWHa--c%7D#Fz~P(f-qW!AG37l! zQ_H2)8$MOjZM9!TIGXT%OJ9*(D672vBkBu~_MT~aP-YO{qIzP<;KyW_d7aS^feL~! z&}Z_nlb8M&@Rc;PoRw4#HS%YQkPglE?c@K(zZL#D2HY8a6~8s&u{DuuA;G8z{QO;a za4Fd}v(AElq@1_!JU=LuO|s>GB0~WYu9QX%PgGds9$Qts6G2E*Dg98PHx0+j`#*>t z`-m5p!NsV*S|dSHm1?dmB-s7Sq#5m#TysDd~M2$z2*&Jw>7q^n_h$x;Vr%tgvtYVUHkJr#lc2EX zXp^h`?aG~C|2`hD<{~^^{wOal^WgIHBXeYsjp1dJex@4zLI0PjlT)!(g?7qMW3JBp z?lZY!YFU;0C3Kpy6B{mPD@iVrGj&6#YVhA#)d-@-eYqp!Uym z&xG}RbiN0KQloOE^Q+Xbt4|iYLw$+xRjbXB@%Sma4^{amd#_Pcb`w4;x^KG8np5@S ziGAM8s71vx^qJN5#`Zn`pq{WHb=C^&nC4k;oH{Ca#^;W1aJEK`Q+kU{cRL8)Fm>pz z}XH#c=Lf!_~YgCRmFWsiL33B2&_8ZIMU5#7Ju2wKizV8GS1B_G2D)y#9^i0678s-I`EG)A+8tFNbP5Z*hSYp07~biRbX;D=FLr?PVLp<=^!5t~=U1kKBPj)|ln zs)YDZFZvnOkK0VP-jfez|1;jK$RaI*S+~xN7UvIIW5?>rO0joz!AdsYsjm5>su>V2 z3rs9TFNhd6bF;#|WsLNUajRo*QPLxfp1qn8%ny;1G*0)Gj;F41B7QK}5^hxdXclil zGW*tp7-`Bi_VKxNb@3dR0rk_Wf6X@Q)&;GmPmVr6p=1Llo8=w;ts1LYqO}sDPQ;;F z9B0=2d*_-Bd77+^9fK%0H;7HZ&+uJN(iALAt?7NM%btd`WnhJ!)G0TuU;Iw#U1RxV z4If=vLU&mC)@wR4*{EWsjDv^3wGpnlnFw)1IP=VV@^4EqJ}|?@>s$9tBH?Zc&BRAd zUu(#NqI)N!Y)zs=kvUg@>y@nPbt}iDl`Z7Z1Gc(aARzETAYJ02G)3^b6yXGO!>cRl z$@aYH^$UromIIQDpxcV5Fy)8iJa9zb)uLmMnlI;P_^D>R>L1H@!H?fKwY`q0vS|Fm z7vJu7>4KAxX;qThvYuGoPkcjH&SL_rBQWUOa6qE>MEG;ILmvI=zZ{Ge1~*YDTEC#P zD+OtUeGYdG2{w9x@N|Fyx>&JuOef>x46|Q=`rMhYI~Shb zwS_q$mmA>|dat^EnClUXjr<~;U4BRsz_TGl-3V6Nj4GY+a3_?uE9fW`RNXM&klina zXgE`O&hR4Q3SpxZb9=bS8LTZkwjX?jqTU^5 z6%Fi5zNV}^7stP!N!^S;=V>`i0haWvFPgzd_Y)pV%~&H&f0$OxOfHT{DaK+YD`6%V zs0;J~jXJcBm}D_ISsmZ4plNQ6g+A5hMoyFh*?kG@Ye|h!yjCAvGw5XuSE-E Date: Tue, 4 Nov 2025 15:07:12 -0800 Subject: [PATCH 2/9] Remove smart quotes in Auditing-Packages.md (#3503) --- docs/concepts/Auditing-Packages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/concepts/Auditing-Packages.md b/docs/concepts/Auditing-Packages.md index 72821f43c..46483aa83 100644 --- a/docs/concepts/Auditing-Packages.md +++ b/docs/concepts/Auditing-Packages.md @@ -201,7 +201,7 @@ If security vulnerabilities are found and updates are available for the package, #### Transitive Packages Often a vulnerability will be in a transitive dependency. -Our recommendation is to prefer updates to packages “closest” to your direct references. +Our recommendation is to prefer updates to packages "closest" to your direct references. Though, there's nothing wrong with just upgrading the package with known vulnerability either. For example, say your project references package A. From 39695e53b305617f40fdb98d5eb1aceff751484c Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Tue, 4 Nov 2025 18:27:52 -0800 Subject: [PATCH 3/9] Add instructions on configuring the NuGet MCP server for GitHub Copilot agent (#3497) --- docs/concepts/NuGet-MCP-Server.md | 78 ++++++++++++++++++ .../media/github-copilot-agent-settings.png | Bin 0 -> 3768 bytes 2 files changed, 78 insertions(+) create mode 100644 docs/concepts/media/github-copilot-agent-settings.png diff --git a/docs/concepts/NuGet-MCP-Server.md b/docs/concepts/NuGet-MCP-Server.md index 9a51f1d89..ccbd97e63 100644 --- a/docs/concepts/NuGet-MCP-Server.md +++ b/docs/concepts/NuGet-MCP-Server.md @@ -73,6 +73,84 @@ To verify that the MCP server is working correctly, open the GitHub Copilot Chat Then click the Tools icon in the bottom toolbar to bring up the Tools menu. You should see the MCP server named "nuget" in the list of available servers. +## Getting started in GitHub Copilot Agent + +You can also configure the MCP Server to work with GitHub Copilot as a Coding Agent in your repositories. +Ensure that you configured your repository to use [GitHub Copilot Coding Agents](https://github.com/settings/copilot/coding_agent). + +Browse to your repository and click the Settings tab. +Expand the Copilot section and click on Coding Agents. + +![GitHub Copilot coding agent settings](./media/github-copilot-agent-settings.png) + +Scroll down to the **Model Context Protocol (MCP)** section and add the following JSON snippet to your `mcpServers` configuration: + +```json +{ + "mcpServers": { + "NuGet": { + "type": "local", + "command": "dnx", + "args": ["NuGet.Mcp.Server", "--yes"], + "tools": ["*"], + "env": {} + } + } +} +``` + +This will make all of NuGet's MCP server tools available. If you want specific tools, you can list them in the `"tools"` parameter array. + +Finally, click the **Save MCP configuration** button to save your changes. + +Now that the NuGet MCP is configured, you will also need to create a GitHub Actions workflow to install .NET 10 Preview 6 or higher so that the `dnx` command is available to run the MCP server. +You can do this by creating the following workflow file in your repository at + +`.github/workflows/copilot-setup-steps.yml` + +The contents of this workflow file should be as follows: + +```yml +name: "Copilot Setup Steps" + +# Automatically run the setup steps when they are changed to allow for easy validation, and +# allow manual testing through the repository's "Actions" tab +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. + copilot-setup-steps: + runs-on: ubuntu-latest + + # Set the permissions to the lowest permissions possible needed for your steps. + # Copilot will be given its own token for its operations. + permissions: + # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete. + contents: read + + # You can define any steps you want, and they will run before the agent starts. + # If you do not check out your code, Copilot will do this for you. + steps: + - name: Install .NET 10.x + uses: actions/setup-dotnet@v5 + with: + dotnet-version: | + 10.x + dotnet-quality: preview + + - name: dotnet --info + run: dotnet --info +``` + +This will ensure that the `dnx` command is available to run the NuGet MCP server when GitHub Copilot runs as a coding agent in your repository. + ## Fixing package vulnerabilities The NuGet MCP server can help you identify and fix package vulnerabilities in your project. diff --git a/docs/concepts/media/github-copilot-agent-settings.png b/docs/concepts/media/github-copilot-agent-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..2b998ee3584c66843623a2e443d9a7bc891b206e GIT binary patch literal 3768 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 literal 0 HcmV?d00001 From 55251011cf977762b9c62d97bd2e337d7a6565cf Mon Sep 17 00:00:00 2001 From: Nigusu Solomon Yenework <59111203+Nigusu-Allehu@users.noreply.github.com> Date: Wed, 5 Nov 2025 14:56:26 -0800 Subject: [PATCH 4/9] Add a general HTTPS everywhere doc (#3498) --- docs/TOC.md | 1 + .../nuget-https-everywhere.md | 97 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 docs/consume-packages/nuget-https-everywhere.md diff --git a/docs/TOC.md b/docs/TOC.md index 0cf22d01f..a49bb6178 100644 --- a/docs/TOC.md +++ b/docs/TOC.md @@ -18,6 +18,7 @@ ### [Package Manager Console (PowerShell)](consume-packages/install-use-packages-powershell.md) ## Configure NuGet ### [Visual Studio options](consume-packages/nuget-visual-studio-options.md) +### [NuGet HTTPS Everywhere](consume-packages/nuget-https-everywhere.md) ### Package restore options #### [Restore packages](consume-packages/package-restore.md) #### [Troubleshooting](consume-packages/package-restore-troubleshooting.md) diff --git a/docs/consume-packages/nuget-https-everywhere.md b/docs/consume-packages/nuget-https-everywhere.md new file mode 100644 index 000000000..47c97e01d --- /dev/null +++ b/docs/consume-packages/nuget-https-everywhere.md @@ -0,0 +1,97 @@ +--- +title: NuGet HTTPS Everywhere +description: Learn why NuGet enforces HTTPS connections for package sources, what errors like NU1302 mean, and how to safely allow HTTP feeds when necessary. +author: Nigusu-Allehu +ms.author: nyenework +ms.date: 10/28/2025 +ms.topic: conceptual +ai-usage: ai-generated +--- + +# NuGet HTTPS Everywhere + +NuGet requires all package sources to use **HTTPS** instead of **HTTP**. +This enforcement protects the software supply chain by preventing tampering and interception during package restore and related operations. +NuGet enforces this requirement by producing an error and stopping the operation when an HTTP source is used. + +## Understanding the HTTP Error + +This error occurs when one or more package sources in your configuration use an **HTTP** URL instead of **HTTPS**. + +In earlier NuGet versions, this scenario produced a **warning** ([`NU1803`](../reference/errors-and-warnings/nu1803.md)). +Beginning with [**NuGet 6.12**](../release-notes/NuGet-6.12.md) and later, it now results in an **error** unless the use of HTTP sources is explicitly permitted. + +### Recommended Resolution + +Before allowing HTTP connections, confirm whether your package source supports HTTPS. +If it does, update the feed URL to use the secure protocol: + +```xml + +``` + +Switching to HTTPS ensures end-to-end encryption and is the recommended and more secure approach. + +### Allowing Insecure HTTP Feeds (Opt-Out) + +If HTTPS is not available and you operate in a trusted or isolated environment, you can explicitly allow HTTP sources. + +#### Option 1: Set allowInsecureConnections in your `NuGet.Config` + +* **Use Visual Studio** + + Enable or disable allowing insecure HTTP connections with the [Package Sources settings](/nuget/consume-packages/nuget-visual-studio-options#allow-insecure-connections) under the Visual Studio options > **NuGet Package Manager**. + +* **Edit `NuGet.Config` manually** + + Add the `allowInsecureConnections="true"` attribute to the affected source: + + ```xml + + + + + + + ``` + +#### Option 2: Use the Command-Line Parameter + +For commands that support it, include the following flag to temporarily permit HTTP connections: + +For **dotnet** commands: + +```bash +--allow-insecure-connections +``` + +For **NuGet.exe** commands, use: + +```powershell +-AllowInsecureConnections +``` + +#### Commands that support opt-out options + +| Tool | Commands | Support for Allow Insecure Connection | +| -------------- | ------------------------- | ------------------------------------- | +| **nuget.exe** | `push` | NuGet **7.0** | +| **dotnet CLI** | `dotnet nuget push` | .NET **10.0.1xx** and newer | +| **dotnet CLI** | `dotnet nuget add source` | .NET **9.0.1xx** and newer | + +## HTTPS Enforcement Rollout Across Tools + +NuGet’s HTTPS enforcement was introduced gradually across releases. +The following table summarizes the progression from [**warnings (NU1803)**](../reference/errors-and-warnings/nu1803.md) to [**errors (NU1302)**](../reference/errors-and-warnings/nu1302.md). + +| Versions Affected | Behavior | +| ----------------------------------------------------- | --------------------------------------------------------------------- | +| [NuGet.exe 6.3](../release-notes/NuGet-6.3.md)+, Visual Studio 17.3+, .NET 6.0.100+ | ⚠️ **Warning (NU1803)** – HTTP sources allowed but discouraged | +| [NuGet.exe 6.12](../release-notes/NuGet-6.12.md)+, Visual Studio 17.12+, .NET 9.0.100+ | ❌ **Error (NU1302)** – HTTP sources blocked unless explicitly allowed| + +## See Also + +* [NU1302](../reference/errors-and-warnings/nu1302.md) +* [NU1803](../reference/errors-and-warnings/nu1803.md) +* [NuGet.Config Reference](../reference/nuget-config-file.md#packagesources) +* [NuGet Visual Studio Options](../consume-packages/nuget-visual-studio-options.md) From a85345c64595dcaaf01f695884548b290f2ed667 Mon Sep 17 00:00:00 2001 From: Nigusu Solomon Yenework <59111203+Nigusu-Allehu@users.noreply.github.com> Date: Wed, 5 Nov 2025 15:36:29 -0800 Subject: [PATCH 5/9] Revise NU1302 documentation with new scenarios (#3471) --- docs/reference/errors-and-warnings/NU1302.md | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/reference/errors-and-warnings/NU1302.md b/docs/reference/errors-and-warnings/NU1302.md index 8bbecf34e..2dd3803d8 100644 --- a/docs/reference/errors-and-warnings/NU1302.md +++ b/docs/reference/errors-and-warnings/NU1302.md @@ -10,6 +10,8 @@ f1_keywords: # NuGet Error NU1302 +## Scenario 1 + > You are running the 'restore' operation with an 'HTTP' source: myHttpSource. NuGet requires HTTPS sources. To use an HTTP source, you must explicitly set 'allowInsecureConnections' to true in your NuGet.Config file. Please refer to https://aka.ms/nuget-https-everywhere for more information. ### Issue @@ -53,3 +55,34 @@ Here's how it functions: > [!WARNING] > Changing SdkAnalysisLevel has other side-effects. Refer to the [`SdkAnalysisLevel`](/dotnet/core/project-sdk/msbuild-props#sdkanalysislevel) for a summary of the full scope of .NET SDK features affected. + +## Scenario 2 + +> You are using a NuGet source 'https://contoso/v3/index.json' that contains an 'HTTP' service index resource endpoint: 'http://contoso/v3-flatcontainer/contoso/index.json'. This is insecure and not recommended. To allow HTTP resources, you must explicitly set 'allowInsecureConnections' to true in your NuGet.Config file. For more information, visit https://aka.ms/nuget-https-everywhere. + +### Issue + +A configured package source uses **HTTPS**, but one of its resources (indicated in the error message) uses **HTTP**. + +NuGet requires that all sources and their resources use HTTPS. +If you want to continue using this source despite its HTTP resource, you must set the `allowInsecureConnections` flag to true in your NuGet.config file. + +To learn more about package sources and resource endpoints, take a look at the [NuGet Server API](../../api/overview). + +#### Option 1: Update the Source to Use HTTPS + +Whenever possible, switch to a package source that provides only HTTPS resources. This is the recommended and most secure option. + +#### Option 2: Allow Insecure Connections (If Necessary) + +If you must use the source, explicitly allow insecure connections by adding the `allowInsecureConnections` flag in the `NuGet.Config`: + +For information about managing the setting in Visual Studio, see [NuGet Options in Visual Studio](../../consume-packages/nuget-visual-studio-options.md#allow-insecure-connections) + +```xml + + + + + +``` From 8936bc99c49c78547dc8032170fb2d28e35ff7ed Mon Sep 17 00:00:00 2001 From: Nikolche Kolev Date: Fri, 7 Nov 2025 12:44:33 -0800 Subject: [PATCH 6/9] Improve the auditing documentation by making it more prescriptive (#3504) --- docs/concepts/Auditing-Packages.md | 165 ++++++++++++++--------------- 1 file changed, 82 insertions(+), 83 deletions(-) diff --git a/docs/concepts/Auditing-Packages.md b/docs/concepts/Auditing-Packages.md index 46483aa83..72d185b5a 100644 --- a/docs/concepts/Auditing-Packages.md +++ b/docs/concepts/Auditing-Packages.md @@ -77,23 +77,7 @@ Note that the [V2 protocol is deprecated](../nuget-org/overview-nuget-org.md#api | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | | [NuGet 6.12, .NET 9.0.100 SDK, and Visual Studio 2022 17.12](../release-notes/NuGet-6.12.md) | Restore | | [NuGet 6.14, .NET 9.0.300 SDK](../release-notes/NuGet-6.14.md) | `dotnet package list --vulnerable` | -| Not yet supported | NuGet AuditSources support in the Visual Studio Package Manager UI | - -#### Excluding advisories - -You can choose to exclude specific advisories from the audit report by adding a new `NuGetAuditSuppress` MSBuild item for each advisory. -Define a `NuGetAuditSuppress` item with the `Include=` metadata set to the advisory URL you wish to suppress. - -```xml - - - -``` - -Similar to the other NuGet audit configuration properties, `NuGetAuditSuppress` items can be defined at the project or repository level. - -`NuGetAuditSuppress` is available for PackageReference projects starting from [NuGet 6.11, Visual Studio 17.11, and the .NET 8.0.400 SDK](../release-notes/NuGet-6.11.md). -It is available for packages.config from [Visual Studio 17.12 and NuGet 6.12](../release-notes/NuGet-6.12.md). +| [NuGet 7.0 and Visual Studio 2026](../release-notes/NuGet-7.0.md) | NuGet AuditSources support in the Visual Studio Package Manager UI | ### Warning codes @@ -113,90 +97,49 @@ Alternatively, if you want to keep low and moderate vulnerabilities as warnings, > [!NOTE] > MSBuild properties for message severity such as `NoWarn` and `TreatWarningsAsErrors` are not supported for packages.config projects. -## Running NuGet Audit in CI - -### Separating Errors from Warnings with a Dedicated Auditing Pipeline - -You can use MSBuild's conditional statements to configure a dedicated CI pipeline for running audits, without audit warnings being treated as errors in other pipelines or on local builds. -Depending on your CI system and team processes, you can have failed runs of the audit pipeline email the team, or you may have a dashboard where you can show a badge of the most recent run of the pipeline. +#### Excluding advisories -Like many things in programming, there are multiple ways to achieve the outcome. -One option is to treat NuGet Audit warnings as errors only in an audit pipeline. +You can exclude advisories by adding a new `NuGetAuditSuppress` MSBuild item for each advisory. +Define a `NuGetAuditSuppress` item with the `Include=` metadata set to the advisory URL you wish to suppress. ```xml - - NU1900;NU1901;NU1902;NU1903;NU1904;NU1905 - $(WarningsAsErrors);$(NuGetAuditCodes) - $(WarningsNotAsErrors);$(NuGetAuditCodes) - -``` - -Then in your pipeline, you run restore specifying the property used by the condition. -For example, using GitHub Actions syntax: - -```yml -- name: Restore with NuGet Auditing - run: dotnet restore -p:AuditPipeline=true + + + ``` -The property name `AuditPipeline` is only an example, and you can customize it as you wish, as long as the name is the same in both the MSBuild condition and the command line. -MSBuild also uses environment variables when reading a property that has not yet been defined, so an environment variable is an alternative to the command line parameter. - -By using conditions to selectively cause NuGet Audit warnings to fail a restore, you can have a dedicated pipeline to check packages for known vulnerabilities, while preventing new security advisories from blocking your bug fixes at inconvenient times. -Keeping NuGet Audit warnings enabled for local builds allows developers to get a non-blocking notification about new security advisories and can encourage upgrading package versions to fix the vulnerabilities more quickly than waiting for someone to check the audit pipeline status. - -### Ensure restore audited projects - -NuGet in MSBuild 17.13 and .NET 9.0.200 added output properties `RestoreProjectCount`, `RestoreSkippedCount` and `RestoreProjectsAuditedCount` on the restore task. -This can be used to enforce that audit ran during a restore. -Note that these output properties are not available with [static graph restore](../reference/msbuild-targets.md#restoring-with-msbuild-static-graph-evaluation). - -Since MSBuild is a scripting language, this can be achieved a number of different ways, but also has the same restrictions as MSBuild has. -One example is to create a file *Directory.Solution.targets* in the same directory as your solution file, whose contents has a target similar to the following. -Note that *Directory.Build.props* is commonly used, but is imported by projects. -However, NuGet's restore target and task runs at the solution level, so needs to be in MSBuild's solution extensibility file, not the project/build file. - -```xml - - - - - -``` +Similar to the other NuGet audit configuration properties, `NuGetAuditSuppress` items can be defined at the project or repository level. -Depending on your use-case, you may wish to use condition `'$(RestoreProjectCount)' != '$([MSBuild::Add($(RestoreProjectsAuditedCount), $(RestoreSkippedCount))'` on the error message, to account for projects that restore skipped because they were already up to date. -Similarly, think about if you want this error to happen everywhere, or only in CI pipelines, and what environment variables are defined in your CI environment, and factor this into the target's condition. -Again, since MSBuild is a scripting language, you can use any of its capabilities to customize your repo however you want. -Viewing [MSBuild's metaproj](/visualstudio/msbuild/how-to-build-specific-targets-in-solutions-by-using-msbuild-exe#troubleshooting) and [binlogs](/visualstudio/msbuild/msbuild-command-line-reference#switches-for-loggers) are useful to develop and troubleshoot solution level targets. +`NuGetAuditSuppress` is available for PackageReference projects starting from [NuGet 6.11, Visual Studio 17.11, and the .NET 8.0.400 SDK](../release-notes/NuGet-6.11.md). +It is available for packages.config from [Visual Studio 17.12 and NuGet 6.12](../release-notes/NuGet-6.12.md). -## `dotnet list package --vulnerable` +##### When to exclude advisories -Once a project is successfully restored, [`dotnet list package`](/dotnet/core/tools/dotnet-list-package) has a `--vulnerable` argument to filter the packages based on which packages have known vulnerabilities. -Note that `--include-transitive` is not default, so should be included. +In scenarios where you have analyzed a specific advisory and have determined that it either does not apply to your scenario, or you are comfortable with the risks it imposes, you can choose to exclude specific advisories from the audit report. +Note that this would completely suppress the advisories, even for packages that share the advisory that may not be part of your project. +`NuGetAuditSuppress` should be considered a last resort for managing advisories. ## Actions when packages with known vulnerabilities are reported Getting a warning about packages with known vulnerabilities is only part of the process. Once discovered, action needs to be taken to remove the potential vulnerability from your solution. -The easiest case is when a package you reference directly has the known vulnerability. -In this situation, update the package version to one that fixes the vulnerability. +The easiest case is when a package you reference directly has the known vulnerability. +In this situation, update the package version to one that fixes the vulnerability. Package vulnerabilities may be reported in both direct and transitive package references. The action you take to resolve may be different because of that. ### Security vulnerabilities found with updates -If security vulnerabilities are found and updates are available for the package, you can either: +If security vulnerabilities are found and updates are available for the package, you can do one of the following: - Edit the `.csproj` or other package version location (`Directory.Packages.props`) with a newer version containing a security fix. - Use the NuGet package manager user interface in Visual Studio to update the individual package. - Run the `dotnet package update --vulnerable` command to update all vulnerable packages in a project to the first version without known vulnerabilities. - Run the `dotnet package update` or `dotnet package add` commands with the respective package ID to update to the latest version. Use [`dotnet add package` when using .NET 9 or earlier](/dotnet/core/whats-new/dotnet-10/sdk#more-consistent-command-order). +- Use the NuGet Model Context Protocol (MCP) server that has the ability to update packages in your project to versions that resolve known vulnerabilities. +See [Fixing package vulnerabilities](NuGet-MCP-Server.md#fixing-package-vulnerabilities) for more information. #### Transitive Packages @@ -254,10 +197,6 @@ If you mouse hover over a package in the package list, the tooltip will include ![Visual Studio Package Manager UI tooltip](media/pm-ui-transitive-tooltip-1.png) -### Use Copilot to update packages -NuGet has released a Model Context Protocol (MCP) server that has the ability to update packages in your project to versions that resolve known vulnerabilities. -See [Fixing package vulnerabilities](NuGet-MCP-Server.md#fixing-package-vulnerabilities) for more information. - ### Security vulnerabilities found with no updates In the case that a known vulnerability exists in a package without a security fix, you can do the following. @@ -290,7 +229,67 @@ On NuGet.org, you can navigate to the package details page and click `Report pac If no security vulnerabilities are found, this means that packages with known vulnerabilities were not found in your package graph at the present moment of time you checked. Since the advisory database can be updated at any time, we recommend regularly checking your `dotnet restore` output and ensuring the same in your continuous integration process. -## Summary +## Running NuGet Audit in CI + +### Separating Errors from Warnings with a Dedicated Auditing Pipeline + +You can use MSBuild's conditional statements to configure a dedicated CI pipeline for running audits, without audit warnings being treated as errors in other pipelines or on local builds. +Depending on your CI system and team processes, you can have failed runs of the audit pipeline email the team, or you may have a dashboard where you can show a badge of the most recent run of the pipeline. + +Like many things in programming, there are multiple ways to achieve the outcome. +One option is to treat NuGet Audit warnings as errors only in an audit pipeline. + +```xml + + NU1900;NU1901;NU1902;NU1903;NU1904;NU1905 + $(WarningsAsErrors);$(NuGetAuditCodes) + $(WarningsNotAsErrors);$(NuGetAuditCodes) + +``` + +Then in your pipeline, you run restore specifying the property used by the condition. +For example, using GitHub Actions syntax: -Security auditing features are crucial for maintaining the security and integrity of software projects. -These features provide you with an additional layer of protection against security vulnerabilities and ensures that you can use open source packages with confidence. +```yml +- name: Restore with NuGet Auditing + run: dotnet restore -p:AuditPipeline=true +``` + +The property name `AuditPipeline` is only an example, and you can customize it as you wish, as long as the name is the same in both the MSBuild condition and the command line. +MSBuild also uses environment variables when reading a property that has not yet been defined, so an environment variable is an alternative to the command line parameter. + +By using conditions to selectively cause NuGet Audit warnings to fail a restore, you can have a dedicated pipeline to check packages for known vulnerabilities, while preventing new security advisories from blocking your bug fixes at inconvenient times. +Keeping NuGet Audit warnings enabled for local builds allows developers to get a non-blocking notification about new security advisories and can encourage upgrading package versions to fix the vulnerabilities more quickly than waiting for someone to check the audit pipeline status. + +### Ensure restore audited projects + +NuGet in MSBuild 17.13 and .NET 9.0.200 added output properties `RestoreProjectCount`, `RestoreSkippedCount` and `RestoreProjectsAuditedCount` on the restore task. +This can be used to enforce that audit ran during a restore. +Note that these output properties are not available with [static graph restore](../reference/msbuild-targets.md#restoring-with-msbuild-static-graph-evaluation). + +Since MSBuild is a scripting language, this can be achieved a number of different ways, but also has the same restrictions as MSBuild has. +One example is to create a file *Directory.Solution.targets* in the same directory as your solution file, whose contents has a target similar to the following. +Note that *Directory.Build.props* is commonly used, but is imported by projects. +However, NuGet's restore target and task runs at the solution level, so needs to be in MSBuild's solution extensibility file, not the project/build file. + +```xml + + + + + +``` + +Depending on your use-case, you may wish to use condition `'$(RestoreProjectCount)' != '$([MSBuild::Add($(RestoreProjectsAuditedCount), $(RestoreSkippedCount))'` on the error message, to account for projects that restore skipped because they were already up to date. +Similarly, think about if you want this error to happen everywhere, or only in CI pipelines, and what environment variables are defined in your CI environment, and factor this into the target's condition. +Again, since MSBuild is a scripting language, you can use any of its capabilities to customize your repo however you want. +Viewing [MSBuild's metaproj](/visualstudio/msbuild/how-to-build-specific-targets-in-solutions-by-using-msbuild-exe#troubleshooting) and [binlogs](/visualstudio/msbuild/msbuild-command-line-reference#switches-for-loggers) are useful to develop and troubleshoot solution level targets. + +## `dotnet list package --vulnerable` + +[`dotnet list package`](/dotnet/core/tools/dotnet-list-package) has a `--vulnerable` argument to filter the packages based on which packages have known vulnerabilities. +Note that `--include-transitive` is not default, so should be included. From 50cc2cd0424782ca31a3349ca81b58db75a5c2fe Mon Sep 17 00:00:00 2001 From: Jeff Kluge Date: Mon, 10 Nov 2025 11:33:35 -0800 Subject: [PATCH 7/9] Add solution file and project to make it easier to load docs in Visual Studio (#3496) --- docs.sln | 38 ++++++++++++++++++++++++++++++++++++++ docs/docs.csproj | 5 +++++ global.json | 5 +++++ 3 files changed, 48 insertions(+) create mode 100644 docs.sln create mode 100644 docs/docs.csproj create mode 100644 global.json diff --git a/docs.sln b/docs.sln new file mode 100644 index 000000000..a90cea1da --- /dev/null +++ b/docs.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.3.11122.13 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "docs", "docs\docs.csproj", "{718966AB-D840-C99F-BC8C-757012BE68AA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C2962E4E-20FC-4C00-858E-D0C62611CBFB}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + .openpublishing.publish.config.json = .openpublishing.publish.config.json + .openpublishing.redirection.json = .openpublishing.redirection.json + CONTRIBUTING.md = CONTRIBUTING.md + global.json = global.json + LICENSE = LICENSE + LICENSE-CODE = LICENSE-CODE + README.md = README.md + ThirdPartyNotices = ThirdPartyNotices + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {718966AB-D840-C99F-BC8C-757012BE68AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {718966AB-D840-C99F-BC8C-757012BE68AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {718966AB-D840-C99F-BC8C-757012BE68AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {718966AB-D840-C99F-BC8C-757012BE68AA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C4A337AF-69A4-496C-97FF-300C3489A718} + EndGlobalSection +EndGlobal diff --git a/docs/docs.csproj b/docs/docs.csproj new file mode 100644 index 000000000..e63c1c5b9 --- /dev/null +++ b/docs/docs.csproj @@ -0,0 +1,5 @@ + + + net472 + + \ No newline at end of file diff --git a/global.json b/global.json new file mode 100644 index 000000000..d894f924e --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "msbuild-sdks": { + "Microsoft.Build.NoTargets" : "3.7.134" + } +} \ No newline at end of file From 7546033ced0c43deaee1df554020d45d0d26db52 Mon Sep 17 00:00:00 2001 From: Donnie Goodson <49205731+donnie-msft@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:36:40 -0800 Subject: [PATCH 8/9] Create NuGet 7.0 Release Notes (#3499) --- docs/release-notes/Index.md | 10 +- docs/release-notes/NuGet-7.0.md | 314 ++++++++++++++++++++++++++++++-- 2 files changed, 307 insertions(+), 17 deletions(-) diff --git a/docs/release-notes/Index.md b/docs/release-notes/Index.md index 638732d93..745e8f4db 100644 --- a/docs/release-notes/Index.md +++ b/docs/release-notes/Index.md @@ -1,8 +1,8 @@ --- title: Release Notes description: Index of NuGet release notes and known issues for all versions. -author: anangaur -ms.author: anangaur +author: donnie-msft +ms.author: eagoodso ms.date: 05/25/2022 ms.topic: release-notes --- @@ -11,7 +11,11 @@ ms.topic: release-notes [Known Issues](../release-notes/known-issues.md) -[Nuget 6.13](../release-notes/NuGet-6.13.md) +[NuGet 7.0](../release-notes/NuGet-7.0.md) + +[NuGet 6.14](../release-notes/NuGet-6.14.md) + +[NuGet 6.13](../release-notes/NuGet-6.13.md) [NuGet 6.12](../release-notes/NuGet-6.12.md) diff --git a/docs/release-notes/NuGet-7.0.md b/docs/release-notes/NuGet-7.0.md index 0582d19aa..0de1486cc 100644 --- a/docs/release-notes/NuGet-7.0.md +++ b/docs/release-notes/NuGet-7.0.md @@ -1,26 +1,312 @@ --- title: NuGet 7.0 Release Notes description: Release notes for NuGet 7.0 including new features, bug fixes, and DCRs. -author: zivkan +author: donnie-msft +ms.author: eagoodso +ms.date: 10/29/2025 ms.topic: release-notes --- -# NuGet 7.0 Release Notes - +# NuGet 7.0 Release Notes NuGet distribution vehicles: | NuGet version | Available in Visual Studio version | Available in .NET SDK(s) | -|:---|:---|:---| -| [**7.0**](https://nuget.org/downloads) | TBD | TBD | +| :---|:---|:---| +| [**7.0.0**](https://nuget.org/downloads) | [Visual Studio 2026 version 18.0.0](https://visualstudio.microsoft.com/downloads/) | [10.0.100](https://dotnet.microsoft.com/download/dotnet/10.0)1 | + +1 Installed with Visual Studio 2026 with any .NET workload + +## Summary: What's New in 7.0.0 + +* Projects that target .NET 10 warn for vulnerabilities in transitive packages by defaulting to NuGetAuditMode=all [#14161](https://github.com/nuget/home/issues/14161) + +* [Package pruning](../consume-packages/Package-References-in-Project-Files.md#prunepackagereference) is enabled for all projects targeting .NET 10 [#14345](https://github.com/NuGet/Home/issues/14345) + +* Created the [NuGet Model Context Protocol (MCP) Server](../concepts/NuGet-MCP-Server.md), supported by .NET 10 SDK or later. +NuGet's MCP is pre-installed in Visual Studio 2026, and installable in VS 17.14 and VS Code. +The server is published on nuget.org as the [NuGet.Mcp.Server](https://www.nuget.org/packages/NuGet.Mcp.Server#readme-body-tab) package. + +* Enable packing legacy PackageReference projects without the need for a package - [#14046](https://github.com/NuGet/Home/issues/14046) + +* Deprecate SHA-1 usage in .NET 10 - [#13814](https://github.com/NuGet/Home/issues/13814) + +* Details pane reflects Vulnerability Data from Audit Sources - [#14554](https://github.com/NuGet/Home/issues/14554) + +* NuGet AuditSources support in the Package Manager UI - [#13954](https://github.com/NuGet/Home/issues/13954) + +* Migrate NuGet's settings to the new Visual Studio Options window + + * Migrate "Package sources" settings in Visual Studio Options - [#14233](https://github.com/NuGet/Home/issues/14233) + + * Migrate "Package Source Mapping" settings in Visual Studio Options - [#14234](https://github.com/NuGet/Home/issues/14234) + +* dotnet update package --vulnerable (Audit fix) - [#13372](https://github.com/NuGet/Home/issues/13372) + +### Breaking changes + +* Add package ID validation during restore - [#14407](https://github.com/NuGet/Home/issues/14407) + +* Project.json is no longer supported in 7.0. Visual Studio 2026 automatically migrated project.json projects to PackageReference + +* Package pruning will lead to a one-time diff in packages lock file - [#14272](https://github.com/NuGet/Home/issues/14272) + +* Pruning privatizes a direct references by apply PrivateAssets=all and IncludeAssets=none - [#14196](https://github.com/NuGet/Home/issues/14196) + +* Raise an error for SHA-1 fingerprints usage in NuGet.exe sign, mssign commands - [#13962](https://github.com/NuGet/Home/issues/13962) + +* Show an error when a non https source is used in a resource in a service index - [#13364](https://github.com/NuGet/Home/issues/13364) + +#### SDK Breaking changes + +* Project.json deprecation + * Remove project.json pack - [#7931](https://github.com/NuGet/Home/issues/7931) + + * Remove project.json support - [#7199](https://github.com/NuGet/Home/issues/7199) + + * Remove PackageSpec.Dependencies - [#14446](https://github.com/NuGet/Home/issues/14446) + + * Clean up Package Spec redudant APIs - [#6231](https://github.com/NuGet/Home/issues/6231) + +* Unused NuGet VS Extensibility APIs removed - [#14403](https://github.com/NuGet/Home/issues/14403) + +* Remove all unused APIs marked as obsolete in NuGet.Frameworks, NuGet.Protocol, NuGet.Commands & NuGet.PackageManagement - [#14395](https://github.com/NuGet/Home/issues/14395) + +* Remove obsolete APIs from NuGet.Common, NuGet.Configuration, NuGet.LibraryModel, NuGet.Packaging and NuGet.ProjectModel - [#14393](https://github.com/NuGet/Home/issues/14393) + +* Block and remove code for unused restore implementations such as `Standalone`. - [#14184](https://github.com/NuGet/Home/issues/14184) + +* Remove `DotnetToolReference` restore - [#14183](https://github.com/NuGet/Home/issues/14183) + +### Issues fixed in this release + +#### NuGet SDK fixes + +* Don't use reflection based deserialization in NuGet.Protocol - [#14470](https://github.com/NuGet/Home/issues/14470) + +* JsonSerializerIsReflectionDisabled on update to Nuget.Protocols 6.13.1 in apps with JsonSerializerIsReflectionEnabledByDefault set to false - [#14111](https://github.com/NuGet/Home/issues/14111) + +#### .NET CLI + +* Enable CanShowDialog for .NET core Authentication Plugins - [#14010](https://github.com/NuGet/Home/issues/14010) + +* "dotnet package update" modifies wrong project file (csproj) - [#14585](https://github.com/NuGet/Home/issues/14585) + +* dotnet nuget verify should output package content hash - [#14384](https://github.com/NuGet/Home/issues/14384) + +* dotnet package update should support --verbosity - [#14319](https://github.com/NuGet/Home/issues/14319) + +* dotnet package update should support CPM and VersionOverride - [#14318](https://github.com/NuGet/Home/issues/14318) + +* dotnet package update should support multiple packages - [#14308](https://github.com/NuGet/Home/issues/14308) + +* dotnet package update should support package source mapping - [#14307](https://github.com/NuGet/Home/issues/14307) + +* dotnet package update to a specific version - [#14306](https://github.com/NuGet/Home/issues/14306) + +* dotnet package update initial version - [#14305](https://github.com/NuGet/Home/issues/14305) + +* [Bug Bash][Unstable] An error “Attempted to divide by zero.” occurs when executing command “dotnet list [ProjectPath] package --vulnerable” - [#14122](https://github.com/NuGet/Home/issues/14122) + +* [Feature]: dotnet list [project | solution] package does not work with solution filters - [#11789](https://github.com/NuGet/Home/issues/11789) + +#### Package Manager UI in Visual Studio + +* Convert Search Control to Fluent UI - [#14469](https://github.com/NuGet/Home/issues/14469) + +* Use Fluent TextBox for Project PM UI Installed Version - [#14466](https://github.com/NuGet/Home/issues/14466) + +* [Bug Bash] There is a tiny gap in the version drop-down list of PM UI - [#11990](https://github.com/NuGet/Home/issues/11990) + +* [Bug Bash] The dropdown list of PM UI doesn’t distinguish the background color between selected-item and hover-on item - [#10977](https://github.com/NuGet/Home/issues/10977) + +* [Bug Bash] Pressing the page-down button on the keyboard when focusing on ‘Version’ drop-down box with Tab key makes the box empty - [#13605](https://github.com/NuGet/Home/issues/13605) + +* Dead Code: ActionsAndVersions View - [#14464](https://github.com/NuGet/Home/issues/14464) + +#### Visual Studio options + +* Decommission Legacy VS Options NuGet Settings - [#14398](https://github.com/NuGet/Home/issues/14398) + +* When adding an http source in the options dialog, have the user click on a checkbox to more explicitly agree to AllowInsecureConnections being added - [#14377](https://github.com/NuGet/Home/issues/14377) + +* Error needed in Package Sources settings for HTTP source without AllowInsecureConnections - [#14367](https://github.com/NuGet/Home/issues/14367) + +* Improve validation of NuGet's settings in Visual Studio Options - [#14359](https://github.com/NuGet/Home/issues/14359) + +* Show validation errors on NuGet options pages while typing - [#14358](https://github.com/NuGet/Home/issues/14358) + +* [Bug Bash] [Unstable] The first removing of a source mapping from the ‘Package Source Mappings’ list in ‘Package Source Mapping’ dialog doesn’t work - [#13520](https://github.com/NuGet/Home/issues/13520) + +* [Localization] The table title ‘Package Source Mapping’ in the ‘Options->NuGet Package Manager->Package Source Mapping’ page was not localized - [#14550](https://github.com/NuGet/Home/issues/14550) + +* [Bug Bash] The offline package source cannot be enabled after disabling it from the ‘Machine-wide package sources’ source list previously in the ‘Options->NuGet Package Manager->Package Sources’ window - [#13434](https://github.com/NuGet/Home/issues/13434) + +* [Bug Bash] The “source” column of the “Add New Package Source Mapping” dialog doesn’t have the minimum width set which makes it can be dragged out of sight - [#13355](https://github.com/NuGet/Home/issues/13355) + +* [Bug Bash] The first reopening of Options dialog should bring back the default package source "Microsoft Visual Studio Offline Packages" in "package sources" list when all the sources were deleted previously - [#13278](https://github.com/NuGet/Home/issues/13278) + +* [Bug Bash] Newly added package source mapping shouldn’t be case-sensitive in “Option->NuGet Package Manager->Package Source Mapping” window - [#13210](https://github.com/NuGet/Home/issues/13210) + +* [Bug Bash] New added package source mapping will lost after switching back to the "Package Source Mapping" tab from other tab in “Option->NuGet Package Manager” window - [#13150](https://github.com/NuGet/Home/issues/13150) + +* [Bug Bash] The “Remove” button should be disable when no package source mapping is selected in the “Package Source Mappings” list - [#13115](https://github.com/NuGet/Home/issues/13115) + +* [CSY] Duplicated hotkeys show in “Options->NuGet Package Manager->Package Sources” dialog - [#7822](https://github.com/NuGet/Home/issues/7822) + +* VS NuGet PMUI - Machine-wide package sources area should be vertically resize-able as well - [#7560](https://github.com/NuGet/Home/issues/7560) + +* [Bug Bash] There will be a duplicated package source when modifying the name of source “Microsoft Visual Studio Offline Packages” - [#13057](https://github.com/NuGet/Home/issues/13057) + +* [Bug Bash] The “Options->NuGet Package Manager->Package Sources” page is disabled after checking or unchecking the checkbox “Enabled” of any one of the package sources having duplicated sources - [#14499](https://github.com/NuGet/Home/issues/14499) + +* Have to manually select pre-populated text on Add Package Source dialog - [#14450](https://github.com/NuGet/Home/issues/14450) + +* VS should not delete Package Source attributes when Name is updated - [#14370](https://github.com/NuGet/Home/issues/14370) + +#### Package Pruning + +* Warning rollout for PrunePackageReference - [#14126](https://github.com/NuGet/Home/issues/14126) + +* Missing audit warnings from "nuget install" when nuget.org is not a package source - [#14096](https://github.com/NuGet/Home/issues/14096) + +* It's not possible to push to HTTP sources specified via command line - [#14047](https://github.com/NuGet/Home/issues/14047) + +* Package pruning is enabled for all projects targeting .NET 10 including multi-targeted ones - [#14345](https://github.com/NuGet/Home/issues/14345) + +* Move pruning enabled frameworks to the NuGet.targets - [#14424](https://github.com/NuGet/Home/issues/14424) + +* Change _RestorePackagePruningDefault to RestorePackagePruningDefault - [#14511](https://github.com/NuGet/Home/issues/14511) + +#### Restore + +* dotnet restore/Visual Studio conflicting with .esproj + Nx project.json - [#13512](https://github.com/NuGet/Home/issues/13512) + +* Improve NU1004 when pruning is used with locked mode - [#14075](https://github.com/NuGet/Home/issues/14075) + +* Consider not writing NuGetToolVersion to generated MSBuild props files on Restore - [#14355](https://github.com/NuGet/Home/issues/14355) + +* NuGet Restore fails if SQL Server Management Studio 21 is installed - [#14349](https://github.com/NuGet/Home/issues/14349) + +* Remove NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING - [#14257](https://github.com/NuGet/Home/issues/14257) + +* Remove RestoreTargetGraph.Name as it's redundant with restoreTargetGraph.TargetGraphName being the widely used version - [#14529](https://github.com/NuGet/Home/issues/14529) + +* Remove RestoreArgs.LockFileVersion as it's functionality unused - [#14524](https://github.com/NuGet/Home/issues/14524) + +* Remove NUGET_BULK_RESTORE_COORDINATION and NUGET_SOLUTION_CACHE_INITIALIZATION fallbacks - [#14502](https://github.com/NuGet/Home/issues/14502) + +#### Dependency resolver + +* New dependency resolver does not properly handle floating prerelease versions - [#13833](https://github.com/NuGet/Home/issues/13833) + +* Reenable new algorithm resolution with lock files - [#13800](https://github.com/NuGet/Home/issues/13800) + +#### Other + +* Stop ilmerging pack - [#13079](https://github.com/NuGet/Home/issues/13079) + +* Make NuGet.Client's Build.ps1 more friendly to GitHub Copilot in VSCode - [#14453](https://github.com/NuGet/Home/issues/14453) + +* Generate identical [Content_Types].xml on repeated builds - [#14357](https://github.com/NuGet/Home/issues/14357) + +* pack legacy csproj: include pack targets and tasks in VS build tools - [#14520](https://github.com/NuGet/Home/issues/14520) + +* VS crashes when the only project in the solution is a project.json project - [#14553](https://github.com/NuGet/Home/issues/14553) + +* review exception handling - [#14440](https://github.com/NuGet/Home/issues/14440) + +* Improve perf by avoiding redundant dictionary lookups - [#14432](https://github.com/NuGet/Home/issues/14432) + +* LockFileLibrary does not need to be mutable - [#14385](https://github.com/NuGet/Home/issues/14385) + +[List of commits in this release](https://github.com/NuGet/NuGet.Client/compare/6.14.1.1...7.0.0.289) + +### Community contributions -## Not yet released +Thank you to all the contributors who helped make this NuGet release awesome! -This version of NuGet is in preview and these release notes will be updated when it is released. +* [SimonCropp](https://github.com/NuGet/NuGet.Client/pull/6720) + * [6720](https://github.com/NuGet/NuGet.Client/pull/6720) remove redundant default constructors + * [6610](https://github.com/NuGet/NuGet.Client/pull/6610) add "does not have a min version" to messages in GetNupkgInfo + * [6581](https://github.com/NuGet/NuGet.Client/pull/6581) remove redundant dictionary lookups in MarkTransitiveOrigin + * [6596](https://github.com/NuGet/NuGet.Client/pull/6596) enable nullability in PackageItemViewModelTests + * [6634](https://github.com/NuGet/NuGet.Client/pull/6634) remove IFrameworkTargetable + * [6616](https://github.com/NuGet/NuGet.Client/pull/6616) avoid redundant version parsing in PluginFindPackageByIdResource + * [6595](https://github.com/NuGet/NuGet.Client/pull/6595) enable nullability in ReadmePreviewViewModelTests + * [6587](https://github.com/NuGet/NuGet.Client/pull/6587) remove redundant dictionary lookup in ProcessUnrankedEntries + * [6598](https://github.com/NuGet/NuGet.Client/pull/6598) enable nullability in EmbeddedResourcesCapabilityTests + * [6577](https://github.com/NuGet/NuGet.Client/pull/6577) use fields instead of private properties + * [6622](https://github.com/NuGet/NuGet.Client/pull/6622) remove un-used list in GetPackagesToBeReinstalled + * [6589](https://github.com/NuGet/NuGet.Client/pull/6589) redundant null check for projectManagerService.GetMetadataAsync return value + * [6605](https://github.com/NuGet/NuGet.Client/pull/6605) enable nullable in VSRestoreSettingsUtilityTests + * [6575](https://github.com/NuGet/NuGet.Client/pull/6575) remove redundant dictionary lookup in CredentialServiceAdapter.GetCredentials + * [6601](https://github.com/NuGet/NuGet.Client/pull/6601) enable nullabe in NuGetInstallCommandTest + * [6593](https://github.com/NuGet/NuGet.Client/pull/6593) enable nullable in IProjectContextInfoExtensionsTests + * [6614](https://github.com/NuGet/NuGet.Client/pull/6614) remove redundant lists in DependencyGraphFileRequestProvider + * [6625](https://github.com/NuGet/NuGet.Client/pull/6625) remove un-used variables in PackageExtractor + * [6609](https://github.com/NuGet/NuGet.Client/pull/6609) fix nullability in UnresolvedMessages + * [6608](https://github.com/NuGet/NuGet.Client/pull/6608) remove un-used contextForGather + * [6628](https://github.com/NuGet/NuGet.Client/pull/6628) remove redundant enumeration in CredentialsItem + * [6617](https://github.com/NuGet/NuGet.Client/pull/6617) remove toolItems list instance in MSBuildRestoreUtility + * [6599](https://github.com/NuGet/NuGet.Client/pull/6599) fix parameter nullability in Constructor_SetReportAbuseUrl_Initialize… + * [6604](https://github.com/NuGet/NuGet.Client/pull/6604) enable nullable in LegacyPackageReferenceProjectTests + * [6631](https://github.com/NuGet/NuGet.Client/pull/6631) remove DependencyGraphSpecRequestProvider.CollectReferences + * [6635](https://github.com/NuGet/NuGet.Client/pull/6635) remove EnvDteProjectExtensions.PathComparer + * [6623](https://github.com/NuGet/NuGet.Client/pull/6623) remove redundant GetManifestResourceNames in ManifestSchemaUtility + * [6619](https://github.com/NuGet/NuGet.Client/pull/6619) remove unused packageID variable + * [6620](https://github.com/NuGet/NuGet.Client/pull/6620) remove un-used variables in PackageManagerControl + * [6640](https://github.com/NuGet/NuGet.Client/pull/6640) remove redundant exception handling + * [6637](https://github.com/NuGet/NuGet.Client/pull/6637) remove PackageManagerControl.AddMigratorBar + * [6629](https://github.com/NuGet/NuGet.Client/pull/6629) remove un-used HashSet instance in ResolverMetadataClient + * [6602](https://github.com/NuGet/NuGet.Client/pull/6602) enable nullable in MSBuildUtilityTest + * [6641](https://github.com/NuGet/NuGet.Client/pull/6641) remove redundant null condition in UpdateCommand.ExecuteCommandAsync + * [6683](https://github.com/NuGet/NuGet.Client/pull/6683) remove redundant string alloc in GetTempFilePath + * [6626](https://github.com/NuGet/NuGet.Client/pull/6626) remove un-used variables in SignedPackageArchiveIOUtility + * [6574](https://github.com/NuGet/NuGet.Client/pull/6574) remove redundant dictionary lookup in CreatePackageSourceMappingDictionary + * [6594](https://github.com/NuGet/NuGet.Client/pull/6594) enable nullability in InfiniteScrollListTests + * [6682](https://github.com/NuGet/NuGet.Client/pull/6682) Use async delay in SafeReadAsync + * [6600](https://github.com/NuGet/NuGet.Client/pull/6600) enable nullable in NuGetUpdateCommandTests + * [6606](https://github.com/NuGet/NuGet.Client/pull/6606) enable nullable in VSNominationUtilitiesTests + * [6613](https://github.com/NuGet/NuGet.Client/pull/6613) remove redundant type variable in GetExternalProject + * [6611](https://github.com/NuGet/NuGet.Client/pull/6611) remove un-used solutionService instances + * [6643](https://github.com/NuGet/NuGet.Client/pull/6643) remove MsBuildUtility.GetMsBuildPathInPathVar + * [6632](https://github.com/NuGet/NuGet.Client/pull/6632) remove PackageSpecFactory.GetTargetFrameworkStrings + * [6573](https://github.com/NuGet/NuGet.Client/pull/6573) avoid some allocation in ProjectFactory.ProcessDependencies + * [6588](https://github.com/NuGet/NuGet.Client/pull/6588) remove dictionary lookups from GetPreviewResultsAsync + * [6597](https://github.com/NuGet/NuGet.Client/pull/6597) fix nullability in PackageModelCreationTestHelper + * [6612](https://github.com/NuGet/NuGet.Client/pull/6612) remove un-used list instances in NuGetPackageManager + * [6591](https://github.com/NuGet/NuGet.Client/pull/6591) enable nullable in PackageSourceValidatorTests + * [6603](https://github.com/NuGet/NuGet.Client/pull/6603) fix nullability in IVsProjectBuildProperties + * [6636](https://github.com/NuGet/NuGet.Client/pull/6636) remove _project* fields from PackageReferenceProject + * [6630](https://github.com/NuGet/NuGet.Client/pull/6630) remove un-used identity instance in LocalV3FindPackageByIdResource + * [6618](https://github.com/NuGet/NuGet.Client/pull/6618) remove LoggerAdapter instance in NuGetPackageManager + * [6621](https://github.com/NuGet/NuGet.Client/pull/6621) remove un-used projectsByUniqueName in SolutionUpToDateChecker + * [6624](https://github.com/NuGet/NuGet.Client/pull/6624) remove un-used variables in PackageBuilder + * [6633](https://github.com/NuGet/NuGet.Client/pull/6633) remove JsonPackageSpecReader DelimitedStringSeparators and VersionSeparators + * [6642](https://github.com/NuGet/NuGet.Client/pull/6642) use cast instead of as and null check in CommandLineParser.AssignValue + * [6615](https://github.com/NuGet/NuGet.Client/pull/6615) remove redundant list in GetPluginAsync + * [6627](https://github.com/NuGet/NuGet.Client/pull/6627) remove un-used GetDirectoryName in MisplacedAssemblyOutsideLibRule + * [6578](https://github.com/NuGet/NuGet.Client/pull/6578) remove redundant dictionary lookup in PrunePackageTree.PruneDowngrades + * [6576](https://github.com/NuGet/NuGet.Client/pull/6576) remove redundant dictionary lookup in RecommenderPackageFeed +* [baronfel](https://github.com/NuGet/NuGet.Client/pull/6554) + * [6554](https://github.com/NuGet/NuGet.Client/pull/6554) Fix NuGet->SDK Codeflow + * [6514](https://github.com/NuGet/NuGet.Client/pull/6514) Pin and stabilize the `NuGetToolVersion` property in the generated NuGet props files during restore. +* [omajid](https://github.com/NuGet/NuGet.Client/pull/6500) + * [6500](https://github.com/NuGet/NuGet.Client/pull/6500) Ensure stable order of entries in Content_Types.xml + * [6507](https://github.com/NuGet/NuGet.Client/pull/6507) Support building on Linux when full signing is not available +* [AlexDelepine](https://github.com/NuGet/NuGet.Client/pull/6793) + * [6793](https://github.com/NuGet/NuGet.Client/pull/6793) Update Ngen Priorities for VS +* [hickford](https://github.com/NuGet/NuGet.Client/pull/6475) + * [6475](https://github.com/NuGet/NuGet.Client/pull/6475) Populate audit sources consistently +* [nohwnd](https://github.com/NuGet/NuGet.Client/pull/6735) + * [6735](https://github.com/NuGet/NuGet.Client/pull/6735) Disable loading profile in utility powershell.exe calls +* [mmitche](https://github.com/NuGet/NuGet.Client/pull/6539) + * [6539](https://github.com/NuGet/NuGet.Client/pull/6539) Move NuGet to xliff-tasks +* [dkurepa](https://github.com/NuGet/NuGet.Client/pull/6644) + * [6644](https://github.com/NuGet/NuGet.Client/pull/6644) Add Version.Details.props +* [bdukes](https://github.com/NuGet/NuGet.Client/pull/6530) + * [6530](https://github.com/NuGet/NuGet.Client/pull/6530) Fix `nuget.exe` restore finding MSBuild from SSMS instead of Visual Studio +* [ToddGrun](https://github.com/NuGet/NuGet.Client/pull/6519) + * [6519](https://github.com/NuGet/NuGet.Client/pull/6519) Make LockFileLibrary immutable for performance and sanity reasons + \ No newline at end of file From 5bc8bf7fd6e525c895164b676a8f8056c578d299 Mon Sep 17 00:00:00 2001 From: edoardo-kolver <88052315+edoardo-kolver@users.noreply.github.com> Date: Fri, 14 Nov 2025 11:27:55 -0800 Subject: [PATCH 9/9] clarified instructions for certificates stored in hardware (#3276) --- docs/create-packages/Sign-a-Package.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/create-packages/Sign-a-Package.md b/docs/create-packages/Sign-a-Package.md index 098353fe7..4b3cb5692 100644 --- a/docs/create-packages/Sign-a-Package.md +++ b/docs/create-packages/Sign-a-Package.md @@ -29,6 +29,8 @@ You can use self-issued certificates for testing purposes. However, packages sig ## Export the certificate file +* If your certificate is stored in a hardware token, you should not export the certificate. Instead, specify the SHA-2 family certificate fingerprints (thumbprint) by using the option `--certificate-fingerprint ` (replacing `--certificate-path `) + * You can export an existing certificate to a binary DER format by using the Certificate Export Wizard. ![Certificate Export Wizard](../reference/media/CertificateExportWizard.png)