npm 審計 audit

2021-10-29 10:48 更新

運行安全審計

概要

npm audit [--json|--parseable]
npm audit fix [--force|--package-lock-only|--dry-run|--production|--only=dev]

描述

審計命令將項目中配置的依賴項的描述提交到默認(rèn)注冊表,并要求提供已知漏洞的報告。如果發(fā)現(xiàn)任何漏洞,則將計算影響和適當(dāng)?shù)难a救措施。如果fix提供了參數(shù),則補救措施將應(yīng)用于包樹。

如果未發(fā)現(xiàn)漏洞,該命令符將以0退出代碼。

請注意,某些漏洞無法自動修復(fù),需要人工干預(yù)或?qū)彶椤?/p>

另請注意,由于npm audit修復(fù)程序在后臺下運行一個完整的npm install,因此適用于安裝程序的所有配置也將適用于npm install。因此就像npm audit fix --package-lock-only只會按預(yù)期工作。

默認(rèn)情況下,如果發(fā)現(xiàn)任何漏洞,審計命令將以非零代碼退出。在 CI 環(huán)境中包含--audit-level參數(shù)以指定導(dǎo)致命令失敗的最低漏洞級別可能很有用。此選項不過濾報告輸出,它只是更改命令的失敗閾值。

審計端點

npm 可以使用兩個審計端點來獲取漏洞信息:Bulk Advusirt=yQucik Audit 端點。

批量咨詢端點

從版本 7 開始,npm 使用更快的Bulk Advisory端點來優(yōu)化計算審計結(jié)果的速度。

npm 將生成一個 JSON 負(fù)載,其中包含樹中每個包的名稱和版本列表,并將其 POST 到路徑/-/npm/v1/security/advisories/bulk處的默認(rèn)配置注冊表。

樹中任何在 package.json 文件中沒有version字段的包都將被忽略。如果指定了任意的--omit選項(通過--omit配置或速記之一,例如?--production、--only=dev等),則將根據(jù)需要從提交的有效負(fù)載中省略包。

如果注冊中心以錯誤或無效響應(yīng)作為響應(yīng),則 npm 將嘗試從Quick Audit端點加載咨詢數(shù)據(jù)。

預(yù)期結(jié)果將包含與建議范圍匹配的每個依賴項的一組建議對象。每個咨詢對象包含nameurl,idseverity,vulnerable_versions,和title。

然后 npm 使用這些咨詢對象來計算樹中依賴項的漏洞和元漏洞。

快速審計端點

如果Bulk Advisory端點返回錯誤或無效數(shù)據(jù),npm 將嘗試從Quick Audit端點加載建議數(shù)據(jù),這在大多數(shù)情況下要慢得多。 package-lock.json提交了在中找到的完整包樹,以及以下附加元數(shù)據(jù):

  • npm_version
  • node_version
  • platform
  • arch
  • node_env

樹中的所有包都提交到 Quick Audit 端點。生成報告時會跳過省略的依賴項類型。

清除

出于謹(jǐn)慎考慮,如果包名包含/字符,npm 版本 5 和 6 會從提交的報告中“清除”任何包,以避免泄露潛在私有包或 git URL 的名稱。

然而,在實踐中,這導(dǎo)致審計經(jīng)常無法正確檢測元漏洞,因為樹會因缺少依賴項而顯得無效,并阻止檢測使用 git 依賴項或私有模塊的包樹中的漏洞。

從版本 7 開始,此清理已從 npm 中刪除。

計算元漏洞和補救措施

npm 使用該?@npmcli/metavuln-calculator?模塊將一組安全公告轉(zhuǎn)換為一組“漏洞”對象。“元漏洞”是由于依賴于易受攻擊包的易受攻擊版本而易受攻擊的依賴項。

例如,如果包foo在 范圍內(nèi)易受攻擊>=1.0.2 <2.0.0,并且包bar依賴于foo@^1.1.0,則bar只能通過安裝易受攻擊版本的 來安裝該版本foo。在這種情況下,bar是一個“元漏洞”。

一旦計算了給定包的元漏洞,它們就會被緩存在~/.npm文件夾中,并且只有在建議范圍發(fā)生變化或包的新版本發(fā)布時才會重新評估(在這種情況下,新版本也會檢查元漏洞狀態(tài)) )。

如果元漏洞鏈一直延伸到根項目,并且在不更改其依賴范圍的情況下無法更新,npm audit fix則將需要--force應(yīng)用修復(fù)的選項。如果補救措施不需要更改依賴范圍,那么所有易受攻擊的軟件包都將更新為沒有針對其發(fā)布建議或元漏洞的版本。

退出代碼

npm audit如果未發(fā)現(xiàn)漏洞,該命令將以 0 退出代碼退出。npm audit fix如果未發(fā)現(xiàn)漏洞或修復(fù)能夠成功修復(fù)所有漏洞,則該命令將以 0 退出代碼退出。

如果發(fā)現(xiàn)漏洞,退出代碼將取決于?audit-level配置設(shè)置。

例子

掃描你的項目中是否存在漏洞,并自定為易受攻擊的依賴項安裝任何兼容更新:

$ npm audit fix

audit fix不修改的情況下運行node_modules,但仍更新 pkglock:

$ npm audit fix --package-lock-only

跳過更新devDependencies

$ npm audit fix --only=prod

audit fix為頂級依賴項安裝 semver-major 更新,而不僅僅是與 semver 兼容的更新:

$ npm audit fix --force

不要運行得到一個什么樣的想法干audit fix就行了,還輸出安裝在JSON格式的信息:

$ npm audit fix --dry-run --json

掃描你的項目是否存在漏洞并僅顯示詳細(xì)信息,無需修復(fù)任何內(nèi)容:

$ npm audit

獲取 JSON 格式的詳細(xì)審計報告:

$ npm audit --json

以純文本結(jié)果獲取詳細(xì)的審計報告,由制表符分隔,允許將來在腳本或命令行后處理中重用,例如,選擇一些打印的列:

$ npm audit --parseable

要解析列,你可以使用 example?awk,然后打印其中的一些:

$ npm audit --parseable | awk -F $'\t' '{print $1,$4}'

配置

audit-level 審計級別

  • 默認(rèn)值:null
  • 類型:null,"info",'low","moderate","high","critical",or"none

npm audit以非零退出代碼退出的最低漏洞級別。

dry-run 試運行

  • 默認(rèn)值:false
  • 類型:Boolean

表示你不希望 npm 進(jìn)行任何更改并且它應(yīng)該只報告它會做的事情。這可以被傳遞到任何修改本地安裝,例如,命令的install,update,?dedupeuninstall,以及packpublish

注意:這不是由其他網(wǎng)絡(luò)相關(guān)的命令,如兌現(xiàn)dist-tags,?owner等等。

force 強制

  • 默認(rèn)值:false
  • 類型:Boolean

刪除各種針對不幸副作用、常見錯誤、不必要的性能下降和惡意輸入的保護(hù)措施。

  • 允許在全局安裝中破壞非 npm 文件。
  • 允許npm version命令在不干凈的 git 存儲庫上工作。
  • 允許刪除緩存文件夾npm cache clean
  • 允許安裝engines聲明要求不同版本的 npm 的包。
  • 允許安裝engines聲明要求不同版本 的包node,即使--engine-strict已啟用。
  • 允許npm audit fix在你聲明的依賴范圍之外安裝模塊(包括 SemVer 主要更改)。
  • 允許取消發(fā)布已發(fā)布包的所有版本。
  • 允許在根項目中安裝沖突的 peerDependencies。--yes期間隱式設(shè)置npm init。
  • 允許破壞現(xiàn)有值?npm pkg

如果你不清楚自己要做什么,強烈建議你不要使用此選項!

json

  • 默認(rèn)值:false
  • 類型:Boolean

是否輸出JSON數(shù)據(jù),而不是正常輸出。

  • npm pkg set它允許在將設(shè)置值保存到您的package.json.并非所有 npm 命令都支持。

package-lock-only 包的唯一鎖

  • 默認(rèn)值:false
  • 類型:Boolean

如果設(shè)置為 true,當(dāng)前操作將只使用package-lock.json,忽略node_modules

因為update這意味著只會package-lock.json更新,而不是檢查node_modules和下載依賴項。

對于list這個裝置的輸出將根據(jù)由所描述的樹?package-lock.json,而不是內(nèi)容node_modules。

omit 省略

  • 默認(rèn)值:如果NODE_ENV環(huán)境變量設(shè)置為production,則為dev,否則為空。
  • 類型:dev、optionalpeer(可多次設(shè)置)

要從磁盤上的安裝樹中省略的依賴項類型。

請注意,這些依賴的仍然解決,加入?package-lock.jsonnpm-shrinkwrap.json文件。它們只是沒有物理安裝在磁盤上。

如果包類型同時出現(xiàn)在--include--omit列表中,則它將被包括在內(nèi)。

如果生成的省略列表包含'dev',則NODE_ENV環(huán)境變量將被設(shè)置'production'為所有生命周期腳本。

workspace 工作區(qū)

  • 默認(rèn):
  • 類型:String(可多次設(shè)置)

允許在當(dāng)前項目的已配置工作區(qū)的上下文中運行命令,同時通過僅運行此配置選項定義的工作區(qū)進(jìn)行過濾。 workspace配置的有效值為:

  • 工作區(qū)名稱
  • 工作區(qū)目錄的路徑
  • 父工作區(qū)目錄的路徑(將導(dǎo)致選擇所有嵌套工作區(qū))

為該npm init命令設(shè)置時,可以將其設(shè)置為尚不存在的工作區(qū)的文件夾,以創(chuàng)建該文件夾并將其設(shè)置為項目中的全新工作區(qū)。

此值不會導(dǎo)出到子進(jìn)程的環(huán)境中。

workspaces 工作區(qū)

  • 默認(rèn)值:false
  • 類型:Boolean

啟用在所有已配置工作區(qū)的上下文中運行命令。

此值不會導(dǎo)出到子進(jìn)程的環(huán)境中。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號