この記事では、GitHub Copilot モダン化のアプリ評価機能で検出できる内容について説明します。 評価には、次の 2 つの主要な機能が含まれます。
最新化の取り組みにとって重要な 3 つのドメインにわたる問題検出:
- クラウド対応性: ファイル システムの使用、資格情報管理、メッセージング サービス、データベース接続、コンテナー化のギャップ、セッション処理、リモート通信パターンなど、16 のカテゴリの懸念事項を特定します。
- Java アップグレード: 古い Java バージョン、OSS サポート終了フレームワーク (Spring Boot、Spring Cloud、Jakarta EE)、数百の削除または非推奨の API、および Ant などのレガシ ビルド ツールにフラグを設定します。
- セキュリティ: インジェクションの脆弱性 (SQL、LDAP、XPath、OS コマンド)、ハードコーディングされた資格情報と暗号化キー、同期の問題、リソース ライフサイクルの問題、およびその他の影響の大きい CWEs をカバーする、ISO/IEC 5055 標準から引き出された 42 個のセキュリティの弱点を検出します。
アプリケーションの理解: レガシ コードベースの場合、評価では使用中の依存関係とテクノロジが表示されるため、移行を開始する前にアプリケーションが依存している内容を明確に把握できます。
次のセクションでは、各ドメインの問題の対象範囲について詳しく説明します。
ドメイン: クラウド対応性
| [ドメイン] | カテゴリ | 検出の概要 | 重要な理由 |
|---|---|---|---|
cloud-readiness |
credential-migration |
ハードコーディングされた AWS 資格情報 (aws_access_key_id、 aws_secret_access_key)、AWS Secrets Manager の使用状況、および Spring Cloud Vault などの埋め込みシークレット管理ライブラリを検出します。 |
セキュリティ: ハードコーディングされた資格情報とベンダー固有のシークレット ストアは、非常に脆弱です。 クラウドネイティブ アプリケーションでは、資格情報の盗難を防ぐために、一元化された ID ベースのセキュリティが必要です。 |
cloud-readiness |
region-configuration |
コードまたは構成ファイル内のハードコーディングされた AWS リージョン識別子 (aws.region、 AWS_REGION) を識別します。 |
移植 性: ハードコーディング地域は、アプリケーションを特定のベンダーの物理インフラストラクチャに結び付け、グローバルな展開と回復性を妨げている。 |
cloud-readiness |
storage-migration |
AWS S3 SDK の使用状況 (バケット、オブジェクト、署名済み URL)、S3 TransferManager、および Google Cloud Storage クライアント ライブラリを検出します。 | 信頼性と配置: これらの依存関係により、ベンダーのオブジェクト ストレージにロックされ、ターゲット プラットフォームのネイティブ ストレージ サービスでは動作しません。 |
cloud-readiness |
messaging-service-migration |
Amazon SQS/SNS、Kafka、RabbitMQ (AMQP)、ActiveMQ (Artemis)、IBM MQ、TIBCO EMS、Solace PubSub+、Amazon Kinesis、Apache Pulsar、Google Cloud Pub/Sub の依存関係と接続文字列にフラグを設定します。 | スケーラビリティと信頼性: 従来のメッセージング ブローカーは、多くの場合、クラウド環境での水平スケーリングと高可用性を妨げる固定エンドポイントとディスク ベースの永続化に依存します。 |
cloud-readiness |
database-migration |
MongoDB、MySQL、PostgreSQL、MSSQL、Cassandra、MariaDB、Oracle、Db2、Sybase ASE、Firebird、SQLite、Google Firestore、Google Cloud Spanner の接続文字列、ドライバー、タイムアウト設定を検出します。 | 信頼性: 自己管理データベースまたは非ネイティブ データベースには、自動化されたクラウド スケーリングがありません。 ハードコーディングされたタイムアウトと固定の再試行間隔により、部分的な停止中にブロックと "再試行の嵐" が発生する可能性があります。 |
cloud-readiness |
file-system-management |
ローカル ストレージ アクセスに対する相対パス/絶対パス、ホーム パス (/home/)、 file:// スキーム、標準の Java IO/NIO または Apache Commons IO 呼び出しの使用を識別します。 |
ステートレス: クラウド コンテナーは一時的です。 ローカル ファイル システムに書き込むと、インスタンスの再起動またはスケーリング操作時にデータが失われます。永続的なデータは外部化する必要があります。 |
cloud-readiness |
local-credential |
プロパティ または XML ファイル内の Java KeyStore (.jks) ファイル、 KeyStore.load メソッド呼び出し、クリア テキスト パスワード (password、 pwd) にフラグを設定します。 |
セキュリティ リスク: 承認されていない個人がアプリケーション環境または構成ファイルにアクセスすると、クリア テキストまたはローカル ファイルに格納されている機密資料が簡単に侵害される可能性があります。 |
cloud-readiness |
configuration-management |
アプリケーション設定の System.getenv、 System.getProperty、外部 .properties/.xml/.ini ファイル、および Windows レジストリ アクセスを検出します。 |
外部: OS 固有のストレージまたはローカル ファイルは大規模に管理できず、すべてのインスタンスでコードを変更しないと動的に更新することはできません。 |
cloud-readiness |
session-management |
HttpSession オブジェクト内のデータ ストレージと、Web 記述子での "再頒布可能" タグの使用を識別します。 |
スケーラビリティ: 標準の HTTP セッションは、クラウドスケーリングには適さない。状態は、インスタンス間のトラフィックシフト中にデータが失われるのを防ぐために、分散キャッシュに外部化する必要があります。 |
cloud-readiness |
remote-communication |
密結合プロトコル (CORBA、RMI、JCA)、セキュリティで保護されていない HTTP/FTP プロトコル、Java メール API、ダイレクト ソケット/NIO チャネルの使用状況、ハードコーディングされた URL を検出します。 | クラウドの互換性とセキュリティ: 密結合された相互作用は、スケーラビリティを妨げる。 セキュリティで保護されていないプロトコルとハードコーディングされた URL は、動的なクラウド ネットワーク環境では脆弱で脆弱です。 |
cloud-readiness |
jakarta-migration |
NoSQL、JPA、Data、WebSocket、および JAX-RS、および JBoss EAP、WebLogic、または WebSphere からのサーバー固有の成果物に対する Jakarta/Java EE 固有の API の使用を検出します。 | サポート: クラウドネイティブ ランタイムに移行するには、最新の Jakarta 名前空間に合わせて調整し、移植性を確保するために独自のアプリケーション サーバーの依存関係を削除する必要があります。 |
cloud-readiness |
containerization |
Dockerfile の欠如や問題のある命令、例えば小文字の使用や構文間隔の問題がある場合にフラグを立てます。 | 信頼性: コンテナー ビルドの標準化は、安定した再現可能なデプロイと、さまざまな環境でイメージが予測どおりに動作するようにするために必要です。 |
cloud-readiness |
scheduled-job-migration |
AWS Lambda ハンドラー、Google Cloud Functions、Quartz Scheduler の依存関係、Spring Batch 処理ワークフローを識別します。 | クラウド コンピューティングの配置: スケジュールされたジョブとサーバーレス関数をリファクタリングして、ターゲット クラウドのイベント ドリブンコンピューティング モデルとサーバーレス コンピューティング モデルを使用してインフラストラクチャのオーバーヘッドを削減する必要があります。 |
cloud-readiness |
apm-migration |
New Relic、Elastic APM、Dynatrace 用の埋め込み APM エージェントとライブラリを識別します。 | 可観測性: これらのツールでは、マネージド環境でテレメトリ、待機時間、正常性データを適切にキャプチャするために、特定のクラウド プラットフォーム統合が必要です。 |
cloud-readiness |
auth-migration |
SAML/OpenSAML、OAuth 2.0、OpenID、Spring Security、LDAP の使用、および従来の Web フォーム認証パターンを検出します。 | モダン ID: 従来の Web フォームと LDAP 認証には、最新のクレーム ベースのクラウド ID プロバイダーの柔軟性とセキュリティ機能 (MFA、SSO) がありません。 |
cloud-readiness |
os-compatibility |
Windows 固有の Dynamic-Link ライブラリ (.dll ファイル) に対するプロジェクトの依存関係を識別します。 | 移植 性: DLL は OS 固有であり、標準の Linux ベースのクラウド コンテナー環境では実行されません。 クロスプラットフォーム共有ライブラリに置き換える必要があります。 |
ドメイン: java-upgrade
| [ドメイン] | カテゴリ | 検出の概要 | 重要な理由 |
|---|---|---|---|
java-upgrade |
java-version-upgrade |
LTS 以外の Java バージョン (9、10、12-16、19、20) とレガシ バージョン (1.x から 8、および 11) の使用状況を識別します。 | セキュリティとサポート: 以前のバージョンと LTS 以外のバージョンには既知の脆弱性が含まれており、長期的なメンテナンス更新プログラムがないため、インフラストラクチャは攻撃にさらされます。 |
java-upgrade |
framework-upgrade |
OSS サポートが終了した Spring Boot、Spring Cloud、Spring Framework、Jakarta EE のバージョンを検出します。 | サポート: 古いフレームワークでは、セキュリティ修正プログラムの受信が停止され、アプリケーションはセキュリティ リスクになり、最新のクラウドネイティブ ツールと互換性がありません。 |
java-upgrade |
deprecated-apis |
JBoss、Seam 2、WebLogic、WebSphere の sun.misc.BASE64、 Thread.stop、 SecurityManager メソッド、独自のフックなど、削除または非推奨の API の数百をカタログ化します。 |
安定性と移植性: 削除された API を使用すると、最新の JVM でランタイムがクラッシュします。 独自のベンダー フック (WebLogic/JBoss 内部など) は、標準ランタイム間でアプリケーションを移植できないようにします。 |
java-upgrade |
build-tool |
Ant (build.xml) や Eclipse 固有のプロジェクト構成 (WTP/JEM の性質) などのレガシ ビルド システムを識別します。 |
オートメーション: 従来のツールには、最新の CI/CD パイプラインへの効率的な統合に必要な標準の規則と依存関係管理がありません。 |
ドメイン: セキュリティ (ISO 5055 ガイド付き)
ISO/IEC 5055 は、セキュリティ、信頼性、パフォーマンス効率、保守容易性の 4 つのビジネスクリティカルな要素でソフトウェア製品の内部構造を測定するための ISO 標準です。 これらの要因によって、ソフトウェア システムの信頼性、信頼性、回復性が決まります。 本質的に、ISO 5055は 、「90% の生産の問題を引き起こす8% の欠陥を見つけて防ぐことを意図しています。 ISO 5055は、信頼性、パフォーマンス効率、セキュリティ、保守容易性という各品質特性の下で最も重要でインパクトのあるCWを識別します。 次の表に示すように、GitHub Copilot のモダン化の場合、ISO 5055で定義されているセキュリティに関するキュレーションされたCWEリストに対して確認します。
| CWE_ID | タイトル | 説明 |
|---|---|---|
CWE-22 |
制限付きディレクトリへのパス名の不適切な制限 ('Path Traversal') | 製品は、外部入力を使用して、制限された親ディレクトリの下にあるファイルまたはディレクトリを識別するためのパス名を構築します。 ただし、特別な要素がパス名を制限付きディレクトリの外部に解決させる問題を防ぐために、それら要素が適切に無効化されていません。 |
CWE-23 |
相対パス トラバーサル | 製品は外部入力を使用して制限付きディレクトリ内にパス名を構築しますが、 ..などのシーケンスを中和できません。このシーケンスは、そのディレクトリの外部で解決される可能性があります。 |
CWE-36 |
絶対パス トラバーサル | 製品は外部入力を使用して制限されたディレクトリ内にパス名を構築しますが、 /abs/pathなどの絶対パス シーケンスを中和できません。このシーケンスは、そのディレクトリの外部で解決できます。 |
CWE-77 |
コマンドに使用される特殊要素の不適切な無効化 ('コマンドインジェクション') | この製品は、外部から影響を受けた入力を使用してコマンドを作成しますが、ダウンストリーム コンポーネントに送信される目的のコマンドを変更できる特別な要素を中和しません。 |
CWE-78 |
OS コマンドで使用される特殊要素の不適切な中和 ('OS コマンドインジェクション') | 製品は、外部から影響を受けた入力を使用して OS コマンドを構築しますが、ダウンストリーム コンポーネントに送信される目的の OS コマンドを変更できる特殊な要素を中和できません。 |
CWE-88 |
コマンド内の引数区切り記号の不適切な中和 ('Argument Injection') | この製品は、別のコンポーネントのコマンド文字列を作成しますが、その文字列内の引数、オプション、またはスイッチを適切に区切りません。 |
CWE-79 |
Web ページの生成中の入力の不適切な中和 ('クロスサイト スクリプティング') | 製品は、他のユーザーに提供される Web ページとして使用される出力に配置する前に、ユーザーが制御できる入力を中和できません。 |
CWE-89 |
SQL コマンドで使用される特殊な要素の不適切な中和 ('SQL インジェクション') | この製品は、外部から影響を受けた入力を使用して SQL コマンドを構築しますが、コマンドを変更できる要素を中和できず、入力を通常のデータではなく SQL 構文として解釈できます。 |
CWE-564 |
SQL インジェクション: ハイバーネート | Hibernate を使用して、ユーザーが制御する入力で構築された動的 SQL ステートメントを実行すると、攻撃者はステートメントの意味を変更したり、任意の SQL コマンドを実行したりすることができます。 |
CWE-90 |
LDAP クエリで使用される特殊要素の不適切な中和 ('LDAP インジェクション') | 製品は、外部から影響を受けた入力を使用して LDAP クエリを作成しますが、ダウンストリーム コンポーネントに送信される目的のクエリを変更できる要素を中和できません。 |
CWE-91 |
XML インジェクション (ブラインド XPath インジェクションとも呼ばれます) | この製品では、XML で使用される特別な要素が適切に中和されないため、攻撃者は処理前に構文、コンテンツ、またはコマンドを変更できます。 |
CWE-99 |
リソース識別子の不適切な制御 ('リソースの挿入') | 製品は入力を受け取りますが、意図した制御範囲外のリソースの識別子として使用する前に、入力を正しく制限しません。 |
CWE-130 |
長さパラメーターの不整合の不適切な処理 | 製品は、書式設定されたメッセージまたは構造体を解析しますが、関連付けられているデータの実際の長さと矛盾する長さフィールドを誤って処理します。 |
CWE-259 |
ハードコーディングされたパスワードの使用 | 製品には、独自の受信認証または外部コンポーネントへの送信通信に使用されるハードコーディングされたパスワードが含まれています。 |
CWE-321 |
ハードコーディングされた暗号化キーの使用 | 製品は、ハードコーディングされた変更できない暗号化キーを使用します。 |
CWE-434 |
危険な種類のファイルの無制限アップロード | この製品では、環境内で自動的に処理される危険なファイルの種類をアップロードできます。 |
CWE-456 |
変数の初期化が見つからない | 製品は重要な変数を初期化しないため、実行環境で予期しない値が使用されます。 |
CWE-457 |
初期化されていない変数の使用 | このコードでは、初期化されていない変数が使用され、予期しない結果や意図しない結果が発生します。 |
CWE-477 |
古い関数の使用 | このコードでは、非推奨または廃止された関数が使用され、アクティブにレビューまたは保守されていないことが示唆されています。 |
CWE-502 |
信頼されていないデータの逆シリアル化 | 製品は、結果のデータが有効であることを十分に確認せずに、信頼されていないデータを逆シリアル化します。 |
CWE-543 |
マルチスレッド コンテキストでの同期なしのシングルトン パターンの使用 | 製品は、適切な同期を行わずにマルチスレッド環境内でリソースを作成するときにシングルトン パターンを使用します。 |
CWE-567 |
マルチスレッド コンテキストでの共有データへの同期されていないアクセス | 製品がスレッド間で静的変数などの共有データを適切に同期できず、未定義の動作が発生します。 |
CWE-570 |
式は常に「偽(False)」です | 製品には、常に false と評価される式が含まれています。 |
CWE-571 |
式は常に True です | 製品には、常に true と評価される式が含まれています。 |
CWE-606 |
ループ条件の未検証入力 | この製品では、ループ条件に使用される入力が正しくチェックされず、過剰なループからサービス拒否が発生する可能性があります。 |
CWE-643 |
XPath 式内のデータの不適切な中和 ('XPath インジェクション') | 製品は外部入力を使用して XML データベースの XPath 式を動的に構築しますが、その入力を中和できません。 |
CWE-652 |
XQuery 式内のデータの不適切な中和 ('XQuery インジェクション') | 製品は外部入力を使用して XQuery 式を動的に構築しますが、その入力を正しく中和できません。 |
CWE-662 |
不適切な同期 | この製品では、複数のスレッドまたはシステムが適切な同期を行わずに共有リソースにアクセスでき、同時アクセスの問題が発生する可能性があります。 |
CWE-665 |
不適切な初期化 | 製品はリソースを初期化したり、誤って初期化したりせず、アクセス時に予期しない状態のままになる可能性があります。 |
CWE-667 |
不適切なロック | 製品がリソースのロックを適切に取得または解放せず、予期しない状態の変更が発生します。 |
CWE-672 |
有効期限またはリリース後のリソースに対する操作 | 製品は、有効期限が切れた後、リリースされた後、または取り消された後にリソースにアクセスまたは操作します。 |
CWE-681 |
数値型間の不適切な変換 | データは、型変換中に省略したり、予期しない値に変換したりすることができ、機密性の高いコンテキストで使用すると危険になる可能性があります。 |
CWE-682 |
正しくない計算 | 製品は、後でセキュリティクリティカルな決定またはリソース管理で使用される不適切な結果を生成する計算を実行します。 |
CWE-732 |
重大なリソースに対する不適切なアクセス許可の割り当て | セキュリティ クリティカルなリソースのアクセス許可は、意図しないアクターが読み取りまたは変更できるように指定されます。 |
CWE-772 |
有効な有効期間後にリソースのリリースが見つからない | 有効な有効期間が終了し、不要になった後、製品はリソースを解放しません。 |
CWE-775 |
有効期間後にファイル記述子またはハンドルがリリースされていない | 製品は、不要になった後、ファイル記述子またはハンドルを解放できません。 |
CWE-778 |
ログ記録が不十分 | 製品は、セキュリティクリティカルなイベントを記録できないか、ログ記録時に重要な詳細を省略します。 |
CWE-783 |
演算子の優先順位ロジック エラー | 式では、演算子の優先順位が原因で正しくないロジックが使用されます。 |
CWE-789 |
過剰なサイズ値を持つメモリ割り当て | 製品は、信頼されていない大きなサイズの値に基づいてメモリを割り当てます。予想される制限内であることを確認する必要はありません。 |
CWE-798 |
ハードコーディングされた資格情報の使用 | 製品には、パスワードや暗号化キーなどのハードコーディングされた資格情報が含まれています。 |
CWE-820 |
同期が欠落している | 製品は、アクセスの同期を試みることなく、共有リソースを同時に利用します。 |
CWE-821 |
正しくない同期 | 製品は共有リソースを同時に利用しますが、アクセスを正しく同期しません。 |
CWE-835 |
到達できない終了条件を持つループ ('Infinite Loop') | 製品には、到達できない終了条件を持つイテレーションまたはループが含まれています。 |
CWE-611 |
XML 外部エンティティ参照の不適切な制限 | 製品は、意図された制御の範囲外で解決される URI を持つエンティティを含む XML ドキュメントを処理します。 |
CWE-1057 |
想定される Data Manager コンポーネント以外のデータ アクセス操作 | 製品は、設計に必要な専用の中央データ マネージャー コンポーネントをバイパスするデータ アクセス操作を実行します。 |