やっつけ不定記

好きなときに好きなことをちゃっちゃと書いてます

Pysaを動かしてみた

前回
https://chocopurin.hatenablog.com/entry/2020/08/08/222013
の続き、目的のPysaに入ります。

Pysaを知るには、チュートリアルPJ
https://github.com/facebook/pyre-check/tree/master/pysa_tutorial
を試した方がよいとのことですが、まずは正攻法で公式ドキュメントから。
Running Pysa
https://pyre-check.org/docs/pysa-running.html
をなぞってみました。
環境は前回のDockerコンテナをそのまま使っています。

(1)必要なファイル群
カッコ内は原文および本件におけるファイル名です。
各々が何を表しているかは原文参照。

・診断対象のソースコード(source.py)
・Taintコンフィグファイル(taint.config)
・Taintスタブ(general.pysa)
・Pysaコンフィグレーション(.pysa_configration)

(2)診断対象の作成

root@[コンテナ名]:/# cd ~
root@[コンテナ名]:~# mkdir static_analysis_example
root@[コンテナ名]:~# apt-get install vim
エディタ入ってなかったので、急遽追加
root@[コンテナ名]:~# vi static_analysis_example/source.py
コードは原文参照

(3)taint.configの作成

root@[コンテナ名]:~# mkdir -p static_analysis_example/stubs/taint
root@[コンテナ名]:~# vi static_analysis_example/stubs/taint/taint.config
コードは原文参照

(4)Taintスタブの作成

root@[コンテナ名]:~# vi static_analysis_example/stubs/taint/general.pysa
コードは原文参照

(5)Pysaコンフィグレーションファイルの作成

root@[コンテナ名]:~# vi static_analysis_example/.pyre_configuration
コードは原文参照

(6)分析の実行

root@[コンテナ名]:~# cd static_analysis_example
root@[コンテナ名]:~/static_analysis_example# source ~/.venvs/venv/bin/activate
(venv) root@[コンテナ名]:~/static_analysis_example# pyre analyze
解析が走って、下記が表示される。
実行時点では原文の内容に加えて"stop_line"と"stop_column"という項目がある。
[
  {
    "line": 9,
    "column": 22,
    "stop_line": 9,
    "stop_column": 32,
    "path": "source.py",
    "code": 5001,
    "name": "Possible shell injection",
    "description":
      "Possible shell injection [5001]: Data from [UserControlled] source(s) may reach [RemoteCodeExecution] sink(s)",
    "long_description":
      "Possible shell injection [5001]: Data from [UserControlled] source(s) may reach [RemoteCodeExecution] sink(s)",
    "concise_description":
      "Possible shell injection [5001]: Data from [UserControlled] source(s) may reach [RemoteCodeExecution] sink(s)",
    "inference": null,
    "define": "source.convert"
  }
]

(6)その他
--save-results-toオプションをつけると、詳細結果がtaint-output.jsonとして保存される。
taint-output.jsonは原文「Static Analysis Post Processor
https://pyre-check.org/docs/static-analysis-post-processor.html
で使う模様。

(venv) root@[コンテナ名]:~/static_analysis_example# pyre analyze --save-results-to ./
(venv) root@[コンテナ名]:~/static_analysis_example# ls
source.py  stubs  taint-metadata.json  taint-output.json
(venv) root@[コンテナ名]:~/static_analysis_example# cat taint-output.json
何かしら、長いJSONが表示される。