用一個動態版本檢索編譯 dependency 會使 build system 易受惡意二進制碼的侵害,或者造成系統發生意外行為。
利用 Apache Ivy 自動化的 dependency 管理系統,用戶能夠為 dependency 指定一種稱為動態修訂的版本狀態,而不是列出特定版本。如果攻擊者能夠危害 dependency 存儲庫,或哄騙 build system 從攻擊者所控制的一個存儲庫下載 dependency,那么,build system 可能唯一做的就是不經任何提示地下載一個動態修訂說明符,并運行受到危害的 dependency。除了安全上的風險以外,動態修訂還會為 code quality 引入了一種額外的風險因素:動態修訂使軟件的安全性和穩定性受控于第三方,即,在開發和發布軟件所使用的 dependency 的那一方。
在編譯過程中,Ivy 將連接到存儲庫,并嘗試檢索與所列狀態匹配的 dependency。
Ivy 接受下面的動態修訂說明符:
- latest.integration:選擇 dependency 模塊的最新修訂。
- latest.[any status]:選擇至少處于指定狀態的 dependency 模塊的最新修訂。例如,latest.milestone 會選擇最新版本,要么是一個重要的修訂版本,要么是一個發布版。而 latest.release 只會選擇最新發布版。
- 任何以 + 結束的修訂:選擇 dependency 模塊的最新子修訂。例如,如果 dependency 存在于修訂版 1.0.3、1.0.7 和 1.1.2 中,則以 1.0.+ 指定的修訂將選擇修訂版 1.0.7。
- 版本范圍:表示范圍的數學符號,例如 < 和 >,可以用來匹配一個版本范圍。
例 1:下面的配置項將指示 Ivy 檢索 clover 組件的最新發布版本:
<dependencies>
<dependency org="clover" name="clover"
rev="latest.release" conf="build->*"/>
...