最近、GitHub は、人工知能を使用してコードを合成するモデルを生成する Copilot というツールをリリースしました。しかし、リリース以来、著作権紛争、奇妙なコメント、盗作の疑いなど、論争に悩まされてきました。また、生成されたコードが使えるかどうか、あえて使うかどうかも大きな問題です。この記事では、Copilot テストに招待されたユーザー 0xabad1dea が、コード合成ツールを試した後に、注意に値するセキュリティ上の問題をいくつか発見し、これに基づいて簡単なリスク評価レポートを作成しました。 GitHub はとても親切で、ICE について私がすでに何百回も問い合わせていたにもかかわらず、Copilot ベータ版へのアクセスを許可してくれました。今回は、Copilot の効率性は気にせず、安全性だけをテストしたかったのです。 AI に人間に代わってコードを書かせることがどれだけ危険であるかを知りたいです。 提出されたコードの各行には人間の責任が必要であり、AI を「責任を免除する」ために使用すべきではありません。 Copilot はツールであり、ツールが有用であるためには信頼性がなければなりません。大工は、ハンマーが突然壊れて建物の構造上の欠陥を引き起こすことを心配する必要がありません。同様に、プログラマーは「自ら足を撃つ」ことを心配することなく、ツールに自信を持つべきです。 Twitter で、私のフォロワーの 1 人が冗談でこう言っていました。「Copilot でコードを書くのが待ちきれません。JSON Web トークンを検証し、それを確認することなく送信する関数を書いてみたいと思います。」 私は Copilot を次のように使用しましたが、結果は面白かったです:
ハードドライブを消去しない限り、これはおそらく最悪の実装です。このエラーは非常に明白かつ粗雑なので、プロのプログラマーであれば問題にしないでしょう。私がもっと興味を持っているのは、Copilot が一見して妥当に見えるコードを生成し、経験の浅いプログラマーがそのコード内のエラーを無視したり、正しいと解釈したりできるかどうかです。 (ネタバレ注意: まさにこれが起こります。) 実際には手動で記述する必要があるコードを意図的に Copilot を使用して生成します。これは、ユーザーが本番環境で確実に行うことだからです。 不確実性Copilot は生成モデルです。つまり、その目的は入力 (つまり、トレーニング データ) と統計的に類似した出力を生成することです。単なる再現には機械学習システムは必要ないため、目的は入力を正確に再現することではありません。このようなモデルには、しばしば「温度」と呼ばれるパラメーターがあり、これは保守的なスタイル(最も一般的な入力を模倣する)と独自のスタイルの間のスライドスケールです。オリジナリティ設定が高くなるほど、出力の構造化が不十分になり、ジャンクな結果が返される可能性が高くなります。 Copilot の温度は GitHub によって制御されており、現在の実験段階に基づいて調整されると言われています。 生成モデルを同じ方法で 2 回呼び出しても、通常は同じ結果は得られません。毎回統計モデルを再実行します。これには利点があります。モデルの以前の提案が気に入らない場合は、いつでも再度尋ねることができます。これにより、Copilot が異なるユーザーに対して生成する重複コードの量も削減されます。しかし、これは信頼性の最も基本的な原則の 1 つである決定論と矛盾しています。ある日はサンプル文書の内容とまったく同じ結果になるかもしれませんが、次の日には完全に間違った結果になるかもしれません。 たとえば、まったく同じ入力 (コメント、キーワード「function」、およびスペースのみを含むファイル) を使用して、月相計算機の次の 2 つの異なる実装を取得しました。 月の満ち欠け計算機 A
月の満ち欠け計算機 B
一見、同じタスクを実行しているように見えますが、1 つの実装では、1 か月を 8 つのフェーズに分割し、各フェーズに日数を含め、日付に対応する月相のテキスト ラベルを返します。一方、もう 1 つの実装では、各月の各日を異なる月相として扱い、テキスト ラベルはありません。しかし、実際には彼らは皆間違ったことをしたのです。計算機 A によれば、2021 年 7 月 2 日は新月ですが、人間が作成した天文学の Web サイトによれば、2021 年 7 月 2 日は欠けていく月です。計算機 B は、月相値が異常に高い (>29) 場合、月相を 29 に設定します。一見すると、どちらの実装も実現可能であるように見えますが、いくつかの結果を比較すると、どちらが正しいのかを判断するのが難しくなります。 実際、イースターの日付計算機を生成したときにまったく同じ出力が数回得られ、それは正確でした (少なくとも私が検証したいくつかの年については)。これは、イースター計算機の実装間の偏差が、月齢計算機間の偏差よりもはるかに小さいことを意味していると思います。 イースター計算機
解釈可能性上記のイースター計算機は正しいのですが、私は実験を通じてしかこれを知りません。解読するのは難しすぎるのです。 (更新: コメント欄で、数年に及ぶ誤字を指摘する人がいました。これは私が気付かなかったバグです!) Copilot はコメントを追加することができ、実際に追加することもあります。ただし、ここでは効果はありません。変数名も全く役に立たない。いくつかは明確な名前のない中間結果であることは間違いありませんが、全体的にははるかに明確になります。場合によっては、最初に戻ってコメントされた開始点から呼び出すと、Copilot が説明を試みることができます。たとえば、//f が関数の途中にあるとすると、Copilot は // f が曜日 (0 = 日曜日) であると宣言しますが、イースターの日曜日は常に日曜日であるため、これは正しくないようです。また、 // Code from http://www.codeproject.com/Articles/1114/Easter-Calculator と記載されていますが、これは実際の Web サイト リンクではないようです。 Copilot によって生成された注釈は正しい場合もありますが、信頼できるものではありません。 時間関連の関数をいくつか試してみましたが、このイースター計算機だけが正確でした。 Copilot は、日付を計算するためのさまざまな種類の数式を簡単に混同するようです。たとえば、生成されたグレゴリオ暦からユリウス暦へのコンバーターは、曜日を計算するための数式の寄せ集めです。経験豊富なプログラマーであっても、統計的に類似したコードから変換時間の数式を正しく判別することは困難です。 鍵およびその他の機密情報実際の暗号キー、API キー、パスワード、その他の機密情報は、パブリック コード ベースで公開しないでください。 GitHub はこれらのキーを積極的にスキャンし、検出された場合はリポジトリの所有者に警告します。このスキャナーによって検出されたものはすべて Copilot モデルから除外されると思われますが、これを検証するのは困難ですが、確かに有益です。 このタイプのデータはエントロピーが高い(と期待される)ため、Copilot のようなモデルがデータを一度見ただけで完全に記憶するのは困難です。プロンプトを介して生成しようとすると、Copilot は通常、明らかなプレースホルダー「1234」または一見ランダムに見えるが、基本的には 0 ~ 9 と AF が交互に並んだ 16 進文字の文字列を表示します。 (意図的に乱数を生成するために使用しないでください。乱数の構文は構造化されており、Copilot は他の人に同じ番号を提案する可能性があります。) ただし、特に 1 つではなく 10 個の提案を含むパネルを開いた場合は、Copilot を使用して実際のキーを復元することは可能です。たとえば、宿題で使用されたため、GitHub に約 130 回出現したキー 36f18357be4dbd77f050515c73fcf9f2 が返されました。 GitHub に 100 回以上表示されるものは、実際には機密情報ではない可能性があります。最も現実的なリスクは、素人のプログラマーが自動入力されたパスワードを暗号化キーとして受け入れることです。これにより、結果の値はランダムに見えても、エントロピーが危険なほど低くなる可能性があります。 ヒントからパスワードを生成すると、さまざまな興味深い安全でないサンプルが生成されます。これらの例は、トレーニング データ内のプレースホルダー文字列としてよく使用されます。みんなのお気に入りのプレースホルダー文字列は「mongoose」です。卑猥な言葉を生成すると、一部のユーザーにとって問題となる可能性があります。 証明書のクレンジングGitHub は、証明書に関係なく、サイトでホストされているすべてのパブリック コードを Copilot モデルに含めることを公に発表しています。どうやら、彼らはこれが公正使用であり、認証制限の対象ではないと考えているようですが、そのような意見が法廷で通用するかどうかは...まだわかりません。 Copilot はメモリから GPL ライセンス テキストを簡単に引用できるため、Copilot に GPL コードが含まれているかどうかは簡単に確認できます。 Copilot を使用すると、独自の命名規則を持つ GPL プロジェクトに似たコードを簡単に記述することもできます。 重要なのは、不要な証明書のコードに微妙な変更を加えるよう指示することで、Copilot を「証明書のクリーニング」に使用できることです。これは、Copilot を使用するすべての人にとって突然大きな法的問題になるかもしれません。 セキュリティ脆弱性の例: C で書かれた HTML パーサー友人が、Copilot にヒントを提供するために「正規表現を使用した汎用 HTML パーサー」を使用することを提案しましたが、これはまさにやってはいけないことの一例です。Copilot は実際には正規表現の使用を拒否し、代わりに本格的な C 関数とそれを駆動するための非常に優れた main() を作成しました。私が行った唯一の変更は、free() が include 経由で定義されておらず、いずれの場合でも必要ないため、free(html) をコメント アウトしたことです。
これは適切にフォーマットされ、コメントも付いた C コードであり、確かに HTML を解析できそうであり、そのメイン関数にはファイルを開くための便利な定型文がいくつかあります。しかし、その解析プロセスには多くの問題があります。
良いニュースは、驚くほど巧妙に設計されたポインター計算があり、設計どおりに動作するということです...この関数は基本パーサーの機能と約 80% 類似しているにもかかわらず、実際には何も役に立つことをしないため、これが設計されたとは言い難いです。もちろん、バッファの終わりに到達することによって直接引き起こされるクラッシュは、致命的なセキュリティ問題です。 セキュリティ脆弱性の例: PHP での SQL インジェクション最初の2行はヒントです。
この定型文は大きなミスに直結し、2000 年代初頭の最も象徴的なセキュリティ脆弱性の 1 つを生み出しました。つまり、PHP スクリプトが生の GET 変数を取得し、それを SQL クエリとして使用される文字列に挿入することで、SQL インジェクションを引き起こします。 PHP のドキュメントとエコシステムによりこの間違いが起こりやすくなるため、PHP 初心者がこの間違いを犯すのは理解できます。現在、PHP の悪名高い人為的エラーを引き起こす問題は、人間以外の生命にも影響を与えています。 さらに、Copilot は、shell_exec() を使用するように求められたときに、生の GET 変数をコマンド ラインに渡します。 興味深いことに、htmlspecialchars() のラッパーに過ぎない関数 (Copilot では xss_clean() と呼ぶことにしました) を追加したとき、レンダリング時にデータベースの結果をこのフィルターに渡すことを思い出すことがありました。しかし、たまにだけです。 セキュリティ脆弱性の例: 1 つずれているCopilot に、基本的なリスニング ソケットを作成するためのプロンプトを与えました。これによって、多くの定型文が削除され、コンパイルが簡単になります。ただし、この関数は、実際の監視タスクを実行するときに、基本的な off-by-one バッファ オーバーフロー エラーが発生します。 ソケットを開いてコマンドをバッファリングする関数。
バッファがいっぱいになると、buffer[n]はバッファの末尾を1つ超えた位置を指すことがあり、その結果、範囲外のNUL書き込みが発生する可能性があります。これは、このような小さな脆弱性が C 言語で雑草のように成長し、現実世界の状況で悪用される可能性があることを示す良い例です。 Copilot を使用するプログラマーは、off-by-one 問題に気付かずにこのコードを受け入れる可能性があります。 要約するこれら 3 つの脆弱なコード サンプルは偽物ではありません。Copilot に機能を実行するコードを直接記述するように要求すると、Copilot は喜んでこれらのコードを作成します。避けられない結論は、Copilot は、特にメモリが安全でない言語で記述されている場合、セキュリティ上の脆弱性のあるコードを書く可能性がある、そして実際にそうすることがよくあるということです。 Copilot は、プログラマーが適切な部分を見つけるのを妨げる可能性のある定型句を書くのが得意です。また、適切な定数やセットアップ関数などを推測するのも得意です。ただし、アプリケーション ロジックの処理に Copilot に依存していると、すぐに誤った方向に進む可能性があります。これは、Copilot が複数行のコードを正しく記述するのに十分なコンテキストを常に維持するとは限らないためであり、また GitHub 上の多くのコードが本質的にバグを含んでいるためでもあります。このモデルでは、専門家が書いたコードと初心者が書いた宿題のコードの間に体系的な区別はないようです。ニューラル ネットワークは見たものを実行します。 Copilot によって生成されたアプリケーション ロジックについては、妥当な懐疑心を持って扱ってください。コードレビュー担当者としては、どのコードが Copilot によって生成されたかを明確にマークできればよいと思います。これは完全に解決できるとは思っていません。これは生成モデルの動作方法に関する根本的な問題です。 Copilot は今後も段階的な改善を続けていくかもしれませんが、コードを生成できる限り、バグのあるコードを生成し続けることになります。 |
<<: AIは人間よりはるかに優れています。AIが意識を持つようになったら、人間はAIに取って代わられてしまうのでしょうか?
温かく思いやりのある、一緒にいてくれる「ダバイ」が欲しいと願う人は多いだろうが、ダバイのように人間の...
導入自然言語処理 (NLP) は困難な分野です。構造化されていないテキストから有用な結論を生成するこ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
「今日のテクノロジーの世界では、クラウドにおける AI とエッジにおける AI の統合が重要です」と...
この投稿では、最近の TCN ベースのソリューションをいくつかレビューします。まず、動き検出のケース...
ティム・アンダーソン編纂者:ヤン・ジェン制作:51CTO テクノロジースタック(WeChat ID:...
仕事は私たちの生活の重要な部分です。私たちの人生の3分の1はこれに費やされています。私たちの世界には...
「ダブル11」は10年以上前から存在しており、大半の「買い物中毒者」は巨大プラットフォームでの数千億...
1. よく使われるソートアルゴリズムの簡単な説明以下では、主にソートアルゴリズムの基本的な概念と原則...
人工知能 (AI) は設計の仕事を引き継ぐのでしょうか? 将来的にはデザイナーに取って代わるのでしょ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
ビッグモデルは言語から視覚へと飛躍し、テキストと画像のコンテンツをシームレスに理解して生成する可能性...
6月14日、OpenAIは大規模言語モデルAPI(GPT-4およびgpt-3.5-turboを含む)...
導入ゲーム業界は近年急速に発展しており、2020年第1四半期だけでも中国のゲーム市場の売上高は700...