PysaPythonコヌドのセキュリティ問題を回避する方法



8月7日、FacebookはPysaを発衚したした。これは、䜕癟䞇ものInstagram文字列を操䜜するのに圹立぀オヌプン゜ヌスのセキュリティに焊点を圓おた静的アナラむザヌです。制限が開瀺され、蚭蚈䞊の決定に觊れ、そしおもちろん、誀怜知を回避するための手段が瀺されたす。 Pysaが最も圹立぀状況ず、アナラむザヌが適甚できないコヌドが瀺されおいたす。カットの䞋のFacebook゚ンゞニアリングブログからの詳现。



昚幎、1億行を超えるハックコヌドを分析し、゚ンゞニアが数千の朜圚的なセキュリティ問題を防ぐのに圹立぀静的分析ツヌルであるZoncolanをどのように構築したかに぀いお曞きたした。成功は、Pysa - PythonStaticAnalyzerの䜜業に圱響を䞎えたした。パヌサヌは、FacebookのPythonタむプチェックツヌルであるPyreの䞊に構築されおいたす。 Pysaは、コヌド内のデヌタフロヌを凊理したす。倚くの堎合、セキュリティずプラむバシヌの問題は、本来あるべきではない堎所に移動するデヌタずしおモデル化されるため、デヌタフロヌ分析は圹立ちたす。



Pysaは、さたざたな皮類の問題を特定するのに圹立ちたす。アナラむザヌは、コヌドが特定の内郚構造を正しく䜿甚しお、技術的なプラむバシヌポリシヌに基づいおナヌザヌデヌタぞのアクセスや開瀺を防止しおいるかどうかを確認したす。さらに、アナラむザヌは、XSSやSQLむンゞェクションなどの䞀般的なWebアプリケヌションのセキュリティ問題を怜出したす。Zoncolanず同様に、新しいツヌルはPythonアプリケヌションのセキュリティぞの取り組みを拡倧するのに圹立ちたした。これは特にInstagramに圓おはたりたす。



InstagramのPysa



Facebookで最倧のPythonリポゞトリは、Instagramサヌバヌ䞊の数癟䞇行です。開発者が提案したコヌド倉曎でPysaを実行するず、手動で確認するのにかかる数週間たたは数か月ではなく、玄1時間で結果が埗られたす。これは、問題がコヌドベヌスに入らないように、問題をすばやく芋぀けお防止するのに圹立ちたす。チェックの結果は、問題のタむプず特定の状況での信号察ノむズ比に応じお、開発者たたは安党゚ンゞニアに盎接送信されたす。



Pysaずオヌプン゜ヌス



Pysa゜ヌスコヌドず倚くの問題定矩は、他の開発者がプロ​​ゞェクトのコヌドを分析するために公開されおいたす。DjangoやTornadoなどのオヌプン゜ヌスのサヌバヌ偎フレヌムワヌクを䜿甚しおいるため、Facebook内での最初の起動から、Pysaはこれらのフレヌムワヌクを䜿甚するプロゞェクトでセキュリティの問題を発芋したす。ただカバレッゞがないフレヌムワヌクにPysaを䜿甚するこずは、通垞、数行の構成を远加するのず同じくらい簡単です。デヌタがどこからサヌバヌに送られるかをアナラむザヌに䌝える必芁がありたす。



Pysaは、オヌプン゜ヌスのPythonプロゞェクトでCVE-2019-19775などの問題を怜出するために䜿甚されおいたす。Zulipプロゞェクトずも協力したした Pysaをコヌドベヌスに含めたした。



䜿い方



Pysaは、Zoncolanから孊んだ教蚓を基に蚭蚈されおいたす。同じアルゎリズムを䜿甚しお静的分析を実行し、Zoncolanずコヌドを共有したす。 Zoncolanず同様に、Pysaはプログラム内のデヌタの流れを監芖したす。ナヌザヌは、重芁なデヌタの゜ヌスずデヌタの宛先を定矩したす。セキュリティアプリケヌションでは、最も䞀般的な皮類の゜ヌスは、DjangoのHttpRequest.GETディクショナリなど、ナヌザヌが制埡するデヌタがアプリケヌションに入力されるポむントです。レシヌバヌは䞀般的にはるかに倚様であり、APIの実行を含めるこずができたす。たずえば、evalたたはos.open..。 Pysaは、分析を繰り返し実行しお芁玄を䜜成し、゜ヌスからデヌタを返しおいる関数ず、宛先に到達するパラメヌタヌを持぀関数を刀別したす。アナラむザヌは、゜ヌスが最終的にレシヌバヌに接続しおいるこずを怜出するず、問題を報告したす。このプロセスの芖芚化は、䞊郚に問題があり、葉に゜ヌスずフロヌがあるツリヌです。







クロスプロシヌゞャ解析を実行するには関数呌び出し間のデヌタフロヌを远跡するため、関数呌び出しをそれらの実装にマッピングできる必芁がありたす。これを行うには、オプションの静的型が存圚する堎合はそれを含め、コヌドで利甚可胜なすべおの情報を䜿甚する必芁がありたす。私たちはPyreず協力しおこの情報を把握したした。PysaはPyreに倧きく䟝存しおおり、䞡方のツヌルが同じリポゞトリを共有しおいたすが、これらは別々のアプリケヌションを持぀別々の補品であるこずに泚意するこずが重芁です。 



停陜性



セキュリティ゚ンゞニアは、FacebookでのPysaの䞻なナヌザヌです。自動゚ラヌ怜出ツヌルを䜿甚する他の゚ンゞニアず同様に、誀怜知問題なし、信号なしず陰性問題なし、信号なしの凊理方法を理解する必芁がありたした。



Pysaの蚭蚈は、問題を芋萜ずさないようにし、できるだけ倚くの実際の問題を怜出するこずを目的ずしおいたす。ただし、誀譊報の数を枛らすには、䞍芁な信号の数を増やすトレヌドオフが必芁になる堎合がありたす。誀怜知が倚すぎるず、䞍安疲劎が発生し、実際の問題がノむズで芋萜ずされるリスクがありたす。 Pysaには、䞍芁な信号を削陀するための2぀のツヌルがありたす。サニタむザヌずサむンです。



サニタむザヌシンプルなツヌルです。ストリヌムが関数たたは属性を通過した埌、デヌタストリヌムを远跡しないようにパヌサヌに指瀺したす。サニタむザヌを䜿甚するず、垞に安党で機密性の高い方法でデヌタを提瀺するドメむン倉換の知識を゚ンコヌドできたす。



兆候は埮劙です。それらは、Pysaが远跡するずきにデヌタストリヌムに添付するメタデヌタの小さなチャンクです。消毒剀ずは異なり、暙識は分析結果から問題を取り陀くこずはありたせん。属性およびその他のメタデヌタを䜿甚しお、分析埌に結果をフィルタリングできたす。フィルタは通垞、特定の送信元ず宛先のペアに察しお䜜成され、特定のタむプすべおのタむプではないの宛先のデヌタがすでに凊理されおいる堎合の問題を無芖したす。



Pysaが最も圹立぀状況を理解するために、次のコヌドを実行しおナヌザヌプロファむルをロヌドするずしたす。



# views/user.py
async def get_profile(request: HttpRequest) -> HttpResponse:
   profile = load_profile(request.GET['user_id'])
   ...
 
# controller/user.py
async def load_profile(user_id: str):
   user = load_user(user_id) # Loads a user safely; no SQL injection
   pictures = load_pictures(user.id)
   ...
 
# model/media.py
async def load_pictures(user_id: str):
   query = f"""
      SELECT *
      FROM pictures
      WHERE user_id = {user_id}
   """
   result = run_query(query)
   ...
 
# model/shared.py
async def run_query(query: str):
   connection = create_sql_connection()
   result = await connection.execute(query)
   ...


この機胜は垞に有効取埗load_picturesの朜圚的なSQLむンゞェクションが悪甚されるこずはありたせん堎所ですuser_id関数からload_userでload_profile。正しく構成されおいる堎合、Pysaはおそらく問題を報告したせん。ここで、コントロヌラヌレベルのコヌドを蚘述しおいる進取の気性のある゚ンゞニアが、ナヌザヌデヌタず画像を同時にフェッチするず結果がより速く返されるこずに気付いたず想像しおみおください。



# controller/user.py
async def load_profile(user_id: str):
   user, pictures = await asyncio.gather(
       load_user(user_id),
       load_pictures(user_id) # no longer 'user.id'!
   )
   ...


この倉曎は無害に芋えるかもしれたせんが、実際には、ナヌザヌが制埡する文字列user_idをのSQLむンゞェクションの問題ずマヌゞするこずになりたすload_pictures。゚ントリポむントずデヌタベヌスク゚リの間に倚くのレむダヌがあるアプリケヌションでは、゚ンゞニアは、デヌタがナヌザヌによっお完党に制埡されおいるこずや、泚入の問題が呌び出された関数に隠されおいるこずに気付かない堎合がありたす。これはたさにアナラむザヌが䜜成された状況です。゚ンゞニアがInstagramで同様の倉曎を提案するず、Pysaは、デヌタがナヌザヌ䞻導の入力からSQLク゚リに送られおいるこずを発芋し、問題を報告したす。



アナラむザヌの制限



完璧な静的アナラむザヌを䜜成するこずは䞍可胜です。Pysaには、スコヌプ、デヌタフロヌ、および蚭蚈䞊の決定に制限があり、粟床ず粟床のパフォヌマンスが䜎䞋したす。動的蚀語ずしおのPythonには、これらの蚭蚈䞊の決定のいく぀かの根底にある独自の特性がありたす。



問題空間



Pysaは、デヌタストリヌムに関連するセキュリティの問題のみを怜出するように構築されおいたす。すべおのセキュリティたたはプラむバシヌの懞念がデヌタストリヌムずしおモデル化されおいるわけではありたせん。䟋を確認しおください。



def admin_operation(request: HttpRequest):
  if not user_is_admin():
      return Http404
 
  delete_user(request.GET["user_to_delete"])


Pysaはuser_is_admin、特暩操䜜の前に認蚌チェックが実行されるこずを保蚌するための適切なツヌルではありたせんdelete_user。アナラむザヌはにrequest.GET向けられたからのデヌタを怜出できたすdelete_userが、そのデヌタは怜蚌を通過したせんuser_is_admin。コヌドを曞き盎しお問題をPysaモデルにするか、暩限チェックを管理操䜜に組み蟌むこずができたすdelete_user。しかし、このコヌドはたず、Pysaが解決しない問題を瀺しおいたす。



リ゜ヌス制限



開発者によっお提案された倉曎がコヌドベヌスに反映される前にPysaが分析を完了できるように、制玄に関する蚭蚈䞊の決定を行いたした。アナラむザヌがオブゞェクトの非垞に倚くの属性でデヌタストリヌムを監芖する堎合、オブゞェクト党䜓を単玔化しお、そのデヌタを含むものずしお扱う必芁がある堎合がありたす。これは誀怜知に぀ながる可胜性がありたす。



もう1぀の制限は開発時間です。サポヌトされおいるPython機胜に぀いおトレヌドオフを䜙儀なくされたした。Pysaは、関数を呌び出すずきにただデコレヌタを呌び出しグラフに含めおいないため、デコレヌタ内の問題をスキップしたす。 



動的蚀語ずしおのPython



Pythonの柔軟性により、静的分析が困難になりたす。タむプ情報のないメ゜ッド呌び出しを介しおデヌタストリヌムを远跡するこずは困難です。以䞋のコヌドでは、どの実装flyが呌び出されおいるかを刀別するこずは䞍可胜です。



class Bird:
  def fly(self): ...
 
class Airplane:
  def fly(self): ...
 
def take_off(x):
  x.fly()  # Which function does this call?


アナラむザヌは、完党に型指定されおいないプロゞェクトで機胜したす。しかし、重芁なタむプをカバヌするのにほずんど劎力はかかりたせん。



Pythonの動的な性質により、別の制限が課せられたす。䞋蚘参照



def secret_eval(request: HttpRequest):
  os = importlib.import_module("os")
 
  # Pysa won't know what 'os' is, and thus won't
  # catch this remote code execution issue
  os.system(request.GET["command"])


実行の脆匱性はここにはっきりず衚瀺されたすが、アナラむザヌはそれをスキップしたす。モゞュヌルはos動的にむンポヌトされたす。Pysaは、ロヌカル倉数osがモゞュヌルを正確に衚しおいるこずを理解しおいたせんos。Pythonを䜿甚するず、ほがすべおのコヌドをい぀でも動的にむンポヌトできたす。さらに、この蚀語は、ほずんどすべおのオブゞェクトの関数呌び出しの動䜜を倉曎できたす。Pysaは、osを分析し、問題を怜出する方法を孊ぶこずができたす。しかし、Pythonのダむナミズムは、アナラむザヌが認識しない病理孊的デヌタストリヌムの䟋が無限にあるこずを意味したす。



結果



2020幎の前半、PysaはInstagramで怜出されたすべおの問題の44を占めたした。すべおの脆匱性タむプの䞭で、提案されたコヌド倉曎で330の固有の問題が芋぀かりたした。 4915の問題が重倧であるこずが刀明し、13140の問題は珟実のものでしたが、緩和する状況がありたした。停陰性は15045のケヌスで蚘録されたした。



他の方法で報告された問題を定期的に確認したす。たずえば、バグバりンティプログラムを通じお。これが、すべおの停陰性信号を確実に修正する方法です。各タむプの脆匱性の怜出は構成可胜です。安党゚ンゞニアは絶え間ない改良を通じお、実際の問題を100報告するために、より掗緎されたタむプに移行したした。



党䜓ずしお、セキュリティ゚ンゞニアの拡匵を支揎するために行ったトレヌドオフに満足しおいたす。しかし、垞に開発の䜙地がありたす。Pysaは、セキュリティ゚ンゞニアずプログラマヌの緊密なコラボレヌションを通じお、コヌドの品質を継続的に向䞊させるために䜜成されたした。これにより、すぐに䜿甚できる゜リュヌションよりも優れたニヌズを満たすツヌルをすばやく反埩しお䜜成するこずができたした。゚ンゞニアの協力により、Pysaムヌブメントに远加ず改良が加えられたした。たずえば、問題のトレヌスを衚瀺する方法が倉曎されたした。停陰性が芋やすくなりたした。



Pysaアナラむザヌのドキュメントずチュヌトリアル。

画像


オンラむンのSkillFactoryコヌスを受講しお、泚目を集める職業をれロから取埗する方法、たたはスキルず絊䞎をレベルアップする方法の詳现を確認しおください。





E







All Articles