Open e4exp opened 3 years ago
機械学習(ML)モデルは,ソフトウェアエンジニアリング業務に利用される機会が増えています. プログラムのリファクタリング、エディタでの自動補完、GUIコードの合成などのアプリケーションは、GitHubのような人気のあるウェブサイトから調達した、プログラムの大規模なリポジトリで学習したMLモデルの恩恵を受けている(Allamanis et al. また、プログラムの推論や評価(Srikant & Aggarwal, 2014; Si et al., 2018)、バグの発見と修正(Gupta et al., 2017; Pradel & Sen, 2018)、マルウェアやプログラムの脆弱性の検出(Li et al., 2018; Zhou et al., 2019)などにも採用されており、従来のプログラム解析ツールを補完しています。 これらのモデルがこのようなアプリケーションに採用され続ける中で、敵対的な攻撃に対してどれだけ堅牢であるかを理解することが重要です。 このような攻撃は、特にセキュリティ(Zhou et al., 2019)やコンプライアンスの自動化(Pedersen, 2010)などの設定において、悪影響を及ぼす可能性があります。 例えば、攻撃者は、悪意のあるプログラムの変更を細工して、モデルがそれらを良性のものとして誤って分類するように仕向けたり、オープンソースとしてライセンスされているコードを組織のプロプライエタリなコードベースで受け渡すように変更したりすることができます。
プログラムを敵対的に擾乱することは、2つの目標を達成する必要があります。 1つは、プログラムの擾乱されたバージョンを与えられたときに、学習されたモデルの判断を反転させること、もう1つは、擾乱が目に見えないことです。 敵対的攻撃は主に画像分類で検討されており(Goodfellow et al., 2014; Carlini & Wagner, 2017; Madry et al., 2018)、画像のピクセルに加えられた計算された小さな変更は、感知不能の要件を満たすのに十分です。 このような変更は、画像を擾乱する前と同じように見せることで人間の注意を逃れますが、その一方で、基礎的な表現を分類器の判断を反転させるほど変更します。
しかし、プログラムの場合は、より厳格な難読性が要求されます。 変更が人間の注意を引かないだけでなく、変更されたプログラムは、重要な点として、機能的には妨害されていないプログラムと同じように動作しなければなりません。 プログラムの難読化は、このようなプログラムの変更を実現するための手段です。 コンピュータ・プログラムの難読化は、リバース・エンジニアリングの試みを回避する方法として、長い間利用されてきました。 難読化とは、人間がプログラムの一部を理解するのを妨げるだけで、元のセマンティクスや機能を維持したまま、プログラムを変換することです。 例えば、一般的な難読化の手法として、変数名を変更することで、プログラムの意図を読み手から隠そうとするものがあります。 プログラムステートメントint sum = 0の変数sumの名前をint xyz = 0に変更しても、コンパイラがこの変数をどのように解析するかは変わらないし、プログラム内の計算や状態も変わらないので、この変数がプログラムの中でどのような役割を果たしているかを理解することができない。 このように、プログラムのごく少数の部分を変更することで、人間がプログラムをどのように理解するかにわずかな影響を与えるだけで、人間にもコンパイラにも気づかれないような変化をもたらす方法を提供します。 本研究では、プログラムに対する敵対的な摂動を、難読化変換を適用することの特別なケースとして捉えています。
想像を絶する変化をもたらす変換候補のセットを特定した上で、変換されたプログラムが敵対的になるような方法で特定のサブセットを選択する必要がある。 この問題に最も接近した最近の試み(Yefet et al., 2019; Ramakrishnan et al., 2020; Bielik & Vechev, 2020)は、厳密な定式化を提供していない。 彼らは、最適な変換のサブセットを選択するための原理的なアプローチを提示することなく、様々な変換を使用することを推奨している。 我々は、解かれたときに、変換する正確な位置と、その位置に適用する変換を提供する定式化を提示する。 図1はその例です。
ランダムに選択されたローカル変数(name)を、最先端のプログラムの攻撃生成アルゴリズム(Ramakrishnan et al.、2020)で生成された名前virtualnameに置き換えても、我々の提案するサイト最適化を適用しない限り、(セットアイテムを予測する)プログラムサマライザを欺くことはできません。 セクション2で詳細な比較を行っています。 我々は、敵対的プログラムを定義する際に中心となる2つの問題、すなわち、摂動を適用するプログラム内のサイトを特定することと、選択されたサイトに適用する特定の摂動を特定することを明らかにした。 摂動とは、既存のトークンを置き換えたり、新しいトークンを挿入したりすることです。
コンピュータプログラムの特性を学習・予測する機械学習(ML)モデルの導入・展開が進んでいる。 これらのモデルは、コードの自動補完、大規模プログラムの要約、プログラムのバグやマルウェアの検出などの用途で成功を収めている。 本研究では、このような学習されたモデルを欺くために、コンピュータプログラムを敵対的に擾乱する原理的な方法を研究し、敵対的な頑健性を決定します。 本研究では、プログラムのリバースエンジニアリングを回避するために従来用いられてきたプログラムの難読化を、敵対的摂動として用いる。 この摂動は、プログラムの機能を変えずに、MLモデルの判断を誤らせるように細工されている。 本研究では、敵対的プログラムの一般的な定式化を行い、任意の言語で書かれたプログラムに複数の難読化変換を適用することができる。 プログラムのどの部分を難読化するか、どのような変換を用いるかという2つの重要な点を効率的に決定するために、一階最適化アルゴリズムを開発しました。 最良の敵対的摂動を受けたプログラムを生成するためには、これらの2つの側面を最適化することが重要であることを示します。 この問題は離散的な性質を持っているため、最適化を容易にするために攻撃損失の状況を改善するランダム化された平滑化を使用することも提案する。 我々は、PythonとJavaのプログラムを用いて、プログラムの要約の問題について評価を行った。 我々の最良の攻撃提案は、\textsc{seq2seq}モデルで訓練されたプログラムのための最先端の攻撃生成アプローチよりも改善を達成することを示す。 さらに、我々の定式化は、敵対的な攻撃に対して頑健なモデルを訓練するのに優れていることを示す。