Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OSS ツールを活用したクラウドネイティブアプリのアップデート影響分析

OSS ツールを活用したクラウドネイティブアプリのアップデート影響分析

Noboru Iwamatsu

March 07, 2024
Tweet

More Decks by Noboru Iwamatsu

Other Decks in Programming

Transcript

  1. 1 © 2024 Fujitsu Limited © 2024 Fujitsu Limited OSSツールを活用した

    クラウドネイティブアプリの アップデート影響分析 富士通株式会社 岩松 昇、溝上 大輝 2024/3/8 Japan Technical Jamboree
  2. 2 © 2024 Fujitsu Limited 自己紹介 •溝上 大輝 • ソフトウェアイノベーション事業本部

    • これまで • ソフトウェア品質の第三者検証を担当 • 趣味でOSSとしてGo言語のモジュール 依存関係管理ファイルを用いた脆弱性 検知ツールなどを開発 •岩松 昇 • ソフトウェアイノベージョン事業本部) シニアディレクター • これまで • OpenStack IaaSアーキテクト • OS、ハイパーバイザー、クラウド研究者 • OpenStack, Ansible, Xen, Linux などオープンソースに10数年貢献 https://www.fujitsu.com/global/about/global-fde/noboru-iwamatsu/ https://www.linkedin.com/in/noboru-iwamatsu/
  3. 3 © 2024 Fujitsu Limited Agenda •Software Supply Chain Attack

    と SBOM •Update Change Impact Analysis •Go言語における対応状況 •実験結果 •まとめ ※本発表はOpen Source Summit Japan 2023における下記発表のダイジェスト+アップデート版です。 ”From SBOM to Call Graphs: Harnessing OSS Tools to Streamline Update Impact Analysis in Cloud Services” https://sched.co/1Tyrg
  4. 4 © 2024 Fujitsu Limited ソフトウェアサプライチェーンアタックとSBOM • ソフトウェアサプライチェーンアタックとは? • 急激に脅威が増しているサイバー攻撃の一種

    • サードパーティコンポーネント(特にOSS)に悪意のあるコードを注入し、最終製品の完全性や セキュリティを毀損させるもの • モダンなソフトウェア開発では大量のOSSコンポーネント(Synopsisのレポートによれば90%以上)を 利用するため脅威が拡大 • SBOM(Software Bill of Materials)とは? • ソフトウェア製品の全コンポーネントの包括的なリスト • サプライチェーンアタックに対する管理手法として注目(米国大統領令、経産省による手引き、など) • SBOM導入で期待されること • 透明性向上:全ソフトウェア部品の出所、ライセンスを一覧化 • 脆弱性検出:セキュリティリスクのあるコンポーネントをスキャン • 即応性:セキュリティリスク特定と対応の迅速化
  5. 5 © 2024 Fujitsu Limited DevOpsへのSBOM適用例 • 今後DevOpsプロセスへのSBOM統合が加速 • ソフトウェア構成管理、脆弱性管理、サプライチェーンリスク管理に活用

    • 開発者にとっては、頻繁な脆弱性情報通知、修正への対応工数が増加 • SBOMはアップデート負担に対しては何もしてくれない。。。 Plan Develop Test Operate SBOM データベース SBOM 生成 スキャン 修正 アラート 脆弱性情報 開発者 インシデント 管理 Deliver
  6. 6 © 2024 Fujitsu Limited Change Impact Analysis導入でアップデートを迅速化 • よくあるアップデート手法とそのリスク

    • Update Change Impact Analysis を導入し、影響範囲を事前特定! リリースノートをチラ見 パッケージを自動更新 既存テストセットの実行 重要な変更の見落とし 更新されたパッケージの 詳細が不明 テストカバレッジが不十分 な可能性 全ての変更箇所と影響、 依存関係を事前に評価 依存関係と セキュリティを管理 変更に対するテストカバレッジ の十分性を保証 Plan Develop Test アラート 不十分な リリース Change Impact Analysis Plan Develop Test アラート リリース
  7. 7 © 2024 Fujitsu Limited 7 © 2024 Fujitsu Limited

    7 Update Change Impact Analysis
  8. 8 © 2024 Fujitsu Limited Update Change Impact Analysis: 基本アイデア

    • 最近の学術研究にインスパイアされ、OSSツールを使ったCIAシステムを開発 • 上記論文の主張 • テストカバレッジは不十分、また、テストによる直接依存・間接依存パッケージの欠陥検出能力も不十分! • テストより静的解析の方が約2倍効果的! • プログラムの本当に変わった箇所(意味的変更)のみ見ればよい! • 実際に使われる関数(コールグラフで特定)のみ見ればよい! https://www.sciencedirect.com/science/article/pii/S0164121221001941
  9. 9 © 2024 Fujitsu Limited UCIA (Update Change Impact Analysis)

    アーキテクチャ app source code file diff Pre-update Call Graph Reachability Analysis Post-update Call Graph update Change History Mapping git clone git log current env. updated env. package manager build package source code specify source repo Change Impact List github github AST diff Update Simulation Semantic Change Detection Call Graph Construction Reachability Analysis Change History Mapping Jenkins pipelineを使って構築
  10. 10 © 2024 Fujitsu Limited UCIA: アップデートシミュレーション app source code

    file diff Pre-update Call Graph Reachability Analysis Post-update Call Graph update Change History Mapping git clone git log current env. updated env. package manager build package source code specify source repo Change Impact List github github AST diff Update Simulation Semantic Change Detection Call Graph Construction Reachability Analysis Change History Mapping ソースからビルドし、アップデート前後の環境を構築
  11. 11 © 2024 Fujitsu Limited アップデート前と後の環境構築 •アプリケーションソースコードからビルド・パッケージインストールを実行 •Node.jsプラットフォームにおける例 • Node.jsインストール済Dockerコンテナを利用

    • アプリケーションソースコードを取得し、package-lock.jsonを利用して環境再現 • アップデートを実施 % npm ci –omit=dev https://docs.npmjs.com/cli/v10/commands/npm-ci # modify the package.json, then % npm update <pkg> –omit=dev
  12. 12 © 2024 Fujitsu Limited UCIA: 意味的変更抽出 app source code

    file diff Pre-update Call Graph Reachability Analysis Post-update Call Graph update Change History Mapping git clone git log current env. updated env. package manager build package source code specify source repo Change Impact List github github AST diff Update Simulation Semantic Change Detection Call Graph Construction Reachability Analysis Change History Mapping アップデート前後のコード差分から、意味的変更箇所のみを抽出
  13. 13 © 2024 Fujitsu Limited ファイルから意味のある変更箇所のみを抽出する • ファイルをASTレベルで比較し、プログラム上意味ある変更(スタイル変更、コメント追記などは 除外)があった関数を特定する。 •

    GumTree (https://github.com/GumTreeDiff/gumtree)を利用 • A syntax-aware diff tool, based on Abstract Syntax Tree(AST). • 学術起源: Fine-grained and accurate source code differencing * • 対応言語: C, C++, C#, Go, Java, JavaScript, Python, R, Ruby, .. pre-update post-update 変更のあった ソースコード AST表現 deleted added updated + - GumTree 関数位置 特定 AST差分 意味的変更 関数リスト diff *ASE '14: Proceedings of the 29th ACM/IEEE International Conference on Automated Software パース パース
  14. 14 © 2024 Fujitsu Limited diffとGumTree出力の比較例 % diff –u <express

    4.17.1>/lib/response.js <express 4.17.2>/lib/response.js … if (arguments.length === 2) { - // res.json(body, status) backwards compat + // res.jsonp(body, status) backwards compat if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); + deprecate('res.jsonp(obj, status): Use res.status(status).jsonp(obj) instead'); this.statusCode = arguments[1]; } else { … - * or when an error occurs. Be sure to check `res.sentHeader` + * or when an error occurs. Be sure to check `res.headersSent` … - * 'appliation/json': function(){ + * 'application/json': function () { … % gumtree cluster <express 4.17.1>/lib/response.js <express 4.17.2>/lib/response.js … New cluster: UPDATE from 'res.jsonp(obj, status): Use res.status(status).json(obj) instead' to 'res.jsonp(obj, status): Use res.status(status).jsonp(obj) instead' ------------ === update-node --- Literal: 'res.jsonp(obj, status): Use res.status(status).json(obj) instead' [6600,6666] replace 'res.jsonp(obj, status): Use res.status(status).json(obj) instead' by 'res.jsonp(obj, status): Use res.status(status).jsonp(obj) instead' https://github.com/expressjs/express/compare/4.17.1...4.17.2
  15. 15 © 2024 Fujitsu Limited UCIA: コールグラフ生成 app source code

    file diff Pre-update Call Graph Reachability Analysis Post-update Call Graph update Change History Mapping git clone git log current env. updated env. package manager build package source code specify source repo Change Impact List github github AST diff Update Simulation Semantic Change Detection Call Graph Construction Reachability Analysis Change History Mapping アップデート前後のコールグラフを作成
  16. 16 © 2024 Fujitsu Limited コールグラフ作成 •Node.jsプラットフォーム • Jelly (https://github.com/cs-au-dk/jelly)を利用

    • 静的解析によるコールグラフ作成ツール • Node.jsプラットフォーム上のJavaScript/TypeScript言語に対応 • 学術起源 •Go言語 • Go Tools (Goの準標準ツール)で作成 • 後で詳しく説明 [1] Benjamin Barslev Nielsen, Martin Toldam Torp, Anders Møller: Modular call graph construction for security scanning of Node.js applications. ISSTA 2021: 29-41 [2] Anders Møller, Benjamin Barslev Nielsen, Martin Toldam Torp: Detecting locations in JavaScript programs affected by breaking library changes. Proc. ACM Program. Lang. 4(OOPSLA): 187:1-187:25 (2020) [3] Asger Feldthaus, Max Schäfer, Manu Sridharan, Julian Dolby, Frank Tip: Efficient construction of approximate call graphs for JavaScript IDE services. ICSE 2013: 752-761
  17. 19 © 2024 Fujitsu Limited UCIA: 到達性解析 app source code

    file diff Pre-update Call Graph Reachability Analysis Post-update Call Graph update Change History Mapping git clone git log current env. updated env. package manager build package source code specify source repo Change Impact List github github AST diff Update Simulation Semantic Change Detection Call Graph Construction Reachability Analysis Change History Mapping 変更された関数のアプリケーションへの到達性を判定
  18. 20 © 2024 Fujitsu Limited NetworkXによる到達性解析 B App A C

    D アップデート前 コールグラフ 意味的変更 関数リスト B App A C D • 意味的変更関数とコールグラフを紐づけ • 意味的変更関数がアプリケーションに 到達するか判定 アップデート後 コールグラフ App A C D B - + 影響パスの検出 (https://networkx.org/)
  19. 21 © 2024 Fujitsu Limited UCIA: 変更履歴マッピング app source code

    file diff Pre-update Call Graph Reachability Analysis Post-update Call Graph update Change History Mapping git clone git log current env. updated env. package manager build package source code specify source repo Change Impact List github github AST diff Update Simulation Semantic Change Detection Call Graph Construction Reachability Analysis Change History Mapping 関数の変更箇所とgitコミットIDをマッピング
  20. 22 © 2024 Fujitsu Limited 変更履歴マッピング処理 •ソースコード取得 • パッケージマネージャーでgitレポジトリを特定 (npmの例)

    •git logコマンドで特定リビジョン間の該当関数の変更コミットを取得 • -Lオプションで<関数>:<ファイル>を指定 • または、行範囲で指定 •最後にOpenPyXL(https://pypi.org/project/openpyxl/)で情報をまとめて Excel化 % npm view <package name> repository.url git+https://github.com/<path>/<package name>.git % git log <tag>..<tag> -L:<funcname>:<file> % git log <tag>..<tag> -L:<start>,<end>:<file>
  21. 23 © 2024 Fujitsu Limited 23 © 2024 Fujitsu Limited

    23 Update Change Impact Analysis Go言語への適用
  22. 24 © 2024 Fujitsu Limited Go言語におけるコールグラフ作成 •CIA(Change Impact Analysis)にはコールグラフが必須! •

    Go Toolsのコールグラフ機能改善を提案してコントリビュート! •Go Toolsとは • Goプログラムの静的解析用 ツール・パッケージ群 • callgraph コマンドで コールグラフ出力が可能 • 複数のアルゴリズムを選択可能 (cha/rta/vta/static) https://github.com/golang/tools
  23. 25 © 2024 Fujitsu Limited Go/callgraphコマンドの使い方 •コマンド例 •標準機能でCaller/Calleeの定義 (行・カラムなど)が出力できなかった! $

    callgraph –algo=cha ¥ –format=“{{.Caller}}--{{.Dynamic}}-{{.Line}}:{{.Column}}-->{{.Callee}}” github.com/spf13/cobra.Gt--static-116:23-->reflect.ValueOf github.com/spf13/cobra.Gt--static-118:16-->(reflect.Value).Kind github.com/spf13/cobra.Gt--static-127:23-->reflect.ValueOf … フォーマットテンプレートの意味 Caller: 呼出元関数のモジュール名と関数名 Callee: 呼出先関数のモジュール名と関数名 Filename: Callerのファイルパス Offset: Callerのオフセット Line: Callerの呼び出し行 Column: Callerのカラム Dynamic: static or dynamic 呼出元モジュール 関数 呼出行・カラム 呼出先関数
  24. 26 © 2024 Fujitsu Limited Go Toolsへのコントリビューション • Caller/Callerの定義場所出力(行、カラム)を提案 •

    関数の定義情報出力を簡単にする posn 関数の導入に結びついた! https://github.com/golang/go/issues/65980
  25. 28 © 2024 Fujitsu Limited 機能追加された結果 •コマンド例 •テンプレートヘルパーposnを使用して簡単に Caller/Calleeの定義・(行・カラムなど)が出力可能に! $

    callgraph –algo=cha ¥ –format=“{{.Caller}}--{{(posn .Caller).Line}}:{{(posn .Caller).Column}}-- {{.Dynamic}}-{{.Line}}:{{.Column}}-->{{.Callee}}- {{(posn .Callee).Line}:{{(posn .Caller).Column}}” github.com/spf13/cobra.Gt--114:6--static-116:23-->reflect.ValueOf-3250:6 github.com/spf13/cobra.Gt--114:6--static-118:16-->(reflect.Value).Kind-85:15 github.com/spf13/cobra.Gt--114:6--static-127:23-->reflect.ValueOf-3250:6 … … 呼出元関数の定義行・カラム New! 呼出先関数の定義行・カラム New!
  26. 29 © 2024 Fujitsu Limited 29 © 2024 Fujitsu Limited

    29 Update Change Impact Analysis 実験結果 例1: axios, 依存関係のない1つのパッケージを更新 例2: azure-rest-blog, 古いパッケージを一気に更新 例3: Grafana(Go言語における検証中の例)
  27. 30 © 2024 Fujitsu Limited 例1: axios, Node.jsでメジャーなHTTP client •Axios

    •Version 1.6.2 (latest) •3依存パッケージの1つを更新 • follow-redirects •1.15.0 → 1.15.3 (最小要求版から最新版へ) •さらなる依存パッケージはなし •form-data •4.0.0 • proxy-from-env •1.1.0 https://axios-http.com/ https://github.com/axios/axios
  28. 31 © 2024 Fujitsu Limited 例1: CIA結果 [email protected]:[email protected]>1.15.3 • follow-redirects

    で5つの関数の意味的変更を検出 • この5つの変更がアプリケーションの657呼出に影響 • 14コミット中、影響する変更は2コミットに絞りこめた パッケージ 数 ファイル数 関数数 関数呼出 数 git commit アプリ パッケージ 計 アップデート前の構成 8 277 アップデート後の構成 8 277 アップデート前後の差分 1 1 14 意味的変更 1 1 0 5 5 コール グラフ アップデート前 8 138 1,987 125 2,112 10,396 アップデート後 8 138 1,987 129 2,116 10,415 到達性解析結果 1 1 657 5 0 2
  29. 32 © 2024 Fujitsu Limited 例1: 考察 [email protected]: [email protected]>1.15.3 •

    変更影響があるのは2コミット • ほとんどの影響(625個)は、1つの関数のリファクタリングに起因 % git log v1.15.0..v1.15.3 --oneline 192dbe7 (tag: v1.15.3) Release version 1.15.3 of the npm package. bd8c81e Fix resource leak on destroy. 9c728c3 Split linting and testing. d388fe2 build: harden ci.yml permissions 9655237 (tag: v1.15.2) Release version 1.15.2 of the npm package. 6e2b86d Default to localhost if no host given. 449e895 Throw invalid URL error on relative URLs. e30137c Use type functions. 76ea31f ternary operator syntax fix 84c00b0 HTTP header lines are separated by CRLF. d28bcbf Create SECURITY.md (#202) 62a551c (tag: v1.15.1) Release version 1.15.1 of the npm package. 7fe0779 Use for ... of. 948c30c Fix redirecting to relative URL when using proxy ファイル 変更関数 状態 影響する 関数呼出 数 index.js destroyRequest added 625 index.js abortRequest deleted 11 index.js isBuffer added 7 index.js isFunction added 7 index.js isString added 7 Total 657
  30. 33 © 2024 Fujitsu Limited 例2: Azure SDK REST Blog

    サンプル •azure-sdk-rest-blog •Version: 1.0.0 •2つの依存パッケージを最新化 •@azure-rest/purview-catalog •1.0.0-beta.3 -> 1.0.0.beta.5 •@azure/identity •2.0.4 -> 2.1.0 https://github.com/Azure-Samples/azure-sdk-rest-blog
  31. 34 © 2024 Fujitsu Limited 例2 CIA結果: Azure SDK REST

    Blog の依存パッケージ全てを更新 • 4,357関数の関数の意味的変更を検出 • この69関数がアプリケーションの1呼出に影響 • 4,731コミット中、影響する変更は11コミットに絞りこめた パッケージ 数 ファイル数 関数数 関数呼出 数 git commit アプリ パッケージ 計 アップデート前の構成 52 2,420 アップデート後の構成 50 2,300 アップデート前後の差分 28 1,062 4,731 意味的変更 25 378 0 4,357 4,357 コールグ ラフ アップデート前 23 83 1 745 745 989 アップデート後 21 36 1 579 578 895 到達性解析結果 6 23 1 69 11
  32. 35 © 2024 Fujitsu Limited 考察1: Azure SDK REST Blog

    における変更点 • アプリケーションは単純に1関数を呼ぶだけ • しかし、呼出先のazure-rest/purview-catalogとその依存パッケージ群が 一気に更新されていた azure-sdk-rest-blog/src/index.ts @azure-rest/purview-catalog @1.0.0-beta.3 -> 1.0.0-beta.5 ├─@azure-rest/core-client @1.0.0-beta.7 -> 1.0.0-beta.9 ├─@azure/core-auth @1.3.2 -> 1.5.0 ├─@azure/core-lro @2.2.4 -> 2.5.4 ├─@azure/[email protected] -> 1.12.2 ├─@azure/logger @1.0.3 -> 1.0.4 └─tslib @2.3.1 -> 2.6.21
  33. 36 © 2024 Fujitsu Limited 考察2: Azure SDK REST Blog

    の依存パッケージ全てを更新 • 半分以上の変更は1つのパッケージ削除に起因 • その他は11コミットに絞りこめた! パッケージ ファイル 変更関数 数 状態 影響する 関数呼出数 @azure- rest/purview-catalog dist/index.js 1 deleted 1 1 added 1 @azure-rest/core- client dist/index.js 12 added 12 @azure/core-rest- pipeline dist/index.js 1 deleted 1 2 added 2 @azure/core-tracing dist/index.js 5 deleted 5 6 added 6 @azure/core-util dist/index.js 6 added 6 @opentelemetry/api (13 files) 35 deleted 35 4 commits 3 commits 1 commit 2 commits 9d78d16527 [core] - Extract OpenTelemetry to a separate package (#19734) パッケージ削除! 1 commit
  34. 37 © 2024 Fujitsu Limited 例3: Grafana (Go言語の検証途中例) •CIA結果 •

    321コミット->2コミットに絞り込み! •Grafana (https://grafana.com/) •version: 10.2.4 • 依存パッケージの1つを更新(部分的検証) • k8s.io/apiserver • 0.28.3 → 0.29.0 Goコールグラフ抜粋 e59c50c66 Remove GAed feature gates OpenAPIV3 2e1024671 Fix v3 spec
  35. 38 © 2024 Fujitsu Limited まとめ: CIAで得られた洞察 •アプリケーションのパッケージ依存関係は複雑だが、パッケージやコードの多く は実際には使われていない。 •ソースコードの意味ある変更とコールグラフを突き合わせることで影響する

    変更のみが特定できる。 •さらにgitログと関連付けることで変更の意図をピンポイントで絞り込める。 •CIAによって脆弱性対応を迅速化し、開発の加速、検証範囲の明確化が 期待できる。 •従来、人によるチェックではとても実現できなかった網羅的で正確性の高い 解析を実現した。 •これらの分析はオープンソースのツールで実現できる!