前回
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が表示される。