AI智能摘要
你是否还在为繁琐的威胁建模手动绘图、漏掉关键风险而头疼?Pytm来了——一款用Python代码定义系统的自动化威胁建模框架。只需编写简洁的Python脚本,它就能自动生成数据流图、序列图,并识别潜在安全威胁。支持自定义威胁库、灵活扩展元素属性,还能输出专业报告。安全从业者的新利器,让威胁建模从“费力耗时”变为“自动化流水线”。
— AI 生成的文章内容摘要
Pytm是一款Python风格的威胁建模框架,它可以帮助我们以Python语言风格的形式并使用pytm框架中的元素和属性来定义你的系统。根据我们的定义参数,pytm可以针对你的系统生成数据流图(DFD)、序列图以及威胁模型。
工具要求
linux/MacOS
Python 3.x
Graphviz package
Java (OpenJDK 10 or 11)
plantuml.jar
工具下载
广大研究人员可以使用下列命令将该项目源码克隆至本地:
git clone https://github.com/izar/pytm.git
工具使用
tm.py [-h] [--debug] [--dfd] [--report REPORT] [--exclude EXCLUDE] [--seq] [--list] [--describe DESCRIBE] optional arguments: -h, --help show this help message and exit --debug print debug messages --dfd output DFD (default) --report REPORT output report using the named template file (sample template file is under docs/template.md) --exclude EXCLUDE specify threat IDs to be ignored --seq output sequential diagram --list list all available threats --describe DESCRIBE describe the properties available for a given element
当前该工具可用的元素包括:TM、服务器、外部实体、数据存储、Actor、进程、进程集、数据边界和Lambda。
除此之外,我们也可以使用命令“–describe”来查看每一个元素的可用属性:
(pytm) ➜ pytm git:(master) ✗ ./tm.py --describe Element Element OS check definesConnectionTimeout description dfd handlesResources implementsAuthenticationScheme implementsNonce inBoundary inScope isAdmin isHardened name onAWS
如果你是安全从业人员的话,你也可以向“threatlib/threats.json”文件中添加新的威胁属性:
{
"SID":"INP01",
"target": ["Lambda","Process"],
"description": "Buffer Overflow via Environment Variables",
"details": "This attack pattern involves causing a buffer overflow through manipulation of environment variables. Once the attacker finds that they can modify an environment variable, they may try to overflow associated buffers. This attack leverages implicit trust often placed in environment variables.",
"Likelihood Of Attack": "High",
"severity": "High",
"condition": "target.usesEnvironmentVariables is True and target.sanitizesInput is False and target.checksInputBounds is False",
"prerequisites": "The application uses environment variables.An environment variable exposed to the user is vulnerable to a buffer overflow.The vulnerable environment variable uses untrusted data.Tainted data used in the environment variables is not properly validated. For instance boundary checking is not done before copying the input data to a buffer.",
"mitigations": "Do not expose environment variable to the user.Do not use untrusted data in your environment variables. Use a language or compiler that performs automatic bounds checking. There are tools such as Sharefuzz [R.10.3] which is an environment variable fuzzer for Unix that support loading a shared library. You can use Sharefuzz to determine if you are exposing an environment variable vulnerable to buffer overflow.",
"example": "Attack Example: Buffer Overflow in $HOME A buffer overflow in sccw allows local users to gain root access via the $HOME environmental variable. Attack Example: Buffer Overflow in TERM A buffer overflow in the rlogin program involves its consumption of the TERM environmental variable.",
"references": "https://capec.mitre.org/data/definitions/10.html, CVE-1999-0906, CVE-1999-0046, http://cwe.mitre.org/data/definitions/120.html, http://cwe.mitre.org/data/definitions/119.html, http://cwe.mitre.org/data/definitions/680.html"
}
注意事项
“threats.json”文件中包含的字符串可以通过eval()函数来运行,它可以确保文件拥有正确的权限并确保代码能够正确执行。
下面的样本是tm.py文件,它描述了一个简单的应用程序,其中一名用户“User”登录进了应用程序,然后在App上发布了评论。App服务器将这些评论存储进了数据库,服务器中有一个AWS Lambda会定期清理数据库。
#!/usr/bin/env python3
from pytm.pytm import TM, Server, Datastore, Dataflow, Boundary, Actor, Lambda
tm = TM("my test tm")
tm.description = "another test tm"
User_Web = Boundary("User/Web")
Web_DB = Boundary("Web/DB")
user = Actor("User")
user.inBoundary = User_Web
web = Server("Web Server")
web.OS = "CloudOS"
web.isHardened = True
db = Datastore("SQL Database (*)")
db.OS = "CentOS"
db.isHardened = False
db.inBoundary = Web_DB
db.isSql = True
db.inScope = False
my_lambda = Lambda("cleanDBevery6hours")
my_lambda.hasAccessControl = True
my_lambda.inBoundary = Web_DB
my_lambda_to_db = Dataflow(my_lambda, db, "(λ)Periodically cleans DB")
my_lambda_to_db.protocol = "SQL"
my_lambda_to_db.dstPort = 3306
user_to_web = Dataflow(user, web, "User enters comments (*)")
user_to_web.protocol = "HTTP"
user_to_web.dstPort = 80
user_to_web.data = 'Comments in HTML or Markdown'
user_to_web.order = 1
web_to_user = Dataflow(web, user, "Comments saved (*)")
web_to_user.protocol = "HTTP"
web_to_user.data = 'Ack of saving or error message, in JSON'
web_to_user.order = 2
web_to_db = Dataflow(web, db, "Insert query with comments")
web_to_db.protocol = "MySQL"
web_to_db.dstPort = 3306
web_to_db.data = 'MySQL insert statement, all literals'
web_to_db.order = 3
db_to_web = Dataflow(db, web, "Comments contents")
db_to_web.protocol = "MySQL"
db_to_web.data = 'Results of insert op'
db_to_web.order = 4
tm.process()
图表将以Dot或PlantUML的形式输出。
如果在运行tm.py文件时使用了“--dfd”参数,那么它将会向stdout生成输出文件:
tm.py --dfd | dot -Tpng -o sample.png
生成的图表如下:
下列命令可以生成一份序列图:
tm.py --seq | java -Djava.awt.headless=true -jar plantuml.jar -tpng -pipe > seq.png
生成的图表和数据可以引入到模板文件中来创建最终的报告:
tm.py --report docs/template.md | pandoc -f markdown -t html > report.html
用于生成报告的模板格式如下:
# Threat Model Sample
***
## System Description
{tm.description}
## Dataflow Diagram

## Dataflows
Name|From|To |Data|Protocol|Port
----|----|---|----|--------|----
{dataflows:repeat:{{item.name}}|{{item.source.name}}|{{item.sink.name}}|{{item.data}}|{{item.protocol}}|{{item.dstPort}}
}
## Findings
{findings:repeat:* {{item.description}} on element "{{item.target}}"
}
当前支持的威胁如下:
INP01 - Buffer Overflow via Environment Variables INP02 - Overflow Buffers INP03 - Server Side Include (SSI) Injection CR01 - Session Sidejacking INP04 - HTTP Request Splitting CR02 - Cross Site Tracing INP05 - Command Line Execution through SQL Injection INP06 - SQL Injection through SOAP Parameter Tampering SC01 - JSON Hijacking (aka JavaScript Hijacking) LB01 - API Manipulation AA01 - Authentication Abuse/ByPass DS01 - Excavation DE01 - Interception DE02 - Double Encoding API01 - Exploit Test APIs AC01 - Privilege Abuse INP07 - Buffer Manipulation AC02 - Shared Data Manipulation DO01 - Flooding HA01 - Path Traversal AC03 - Subverting Environment Variable Values DO02 - Excessive Allocation DS02 - Try All Common Switches INP08 - Format String Injection INP09 - LDAP Injection INP10 - Parameter Injection INP11 - Relative Path Traversal INP12 - Client-side Injection-induced Buffer Overflow AC04 - XML Schema Poisoning DO03 - XML Ping of the Death AC05 - Content Spoofing INP13 - Command Delimiters INP14 - Input Data Manipulation DE03 - Sniffing Attacks CR03 - Dictionary-based Password Attack API02 - Exploit Script-Based APIs HA02 - White Box Reverse Engineering DS03 - Footprinting AC06 - Using Malicious Files HA03 - Web Application Fingerprinting SC02 - XSS Targeting Non-Script Elements AC07 - Exploiting Incorrectly Configured Access Control Security Levels INP15 - IMAP/SMTP Command Injection HA04 - Reverse Engineering SC03 - Embedding Scripts within Scripts INP16 - PHP Remote File Inclusion AA02 - Principal Spoof CR04 - Session Credential Falsification through Forging DO04 - XML Entity Expansion DS04 - XSS Targeting Error Pages SC04 - XSS Using Alternate Syntax CR05 - Encryption Brute Forcing AC08 - Manipulate Registry Information DS05 - Lifting Sensitive Data Embedded in Cache
项目地址
Pytm:【GitHub传送门】


上海市 1F
这玩意儿能跑在M1芯片上吗?
湖北省孝感市安陆市 B1
@ 米米糖 M1上装OpenJDK 11简直折磨,Rosetta转译勉强跑起来。
韩国 2F
感觉还行,就是环境配置有点麻烦。
北京市 B1
@ 胡歌 配环境配到头大,Graphviz又报错。
韩国 B1
@ 胡歌 环境配置确实头疼,Graphviz版本坑了我半小时。
日本 3F
之前搞过类似的东西,折腾了好久才跑起来 😂
江苏省南京市 4F
–describe 参数真方便,查属性省事多了。
湖南省长沙市 B1
@ 秋千荡高高 –describe 真香,省得翻源码了。
广东省广州市 5F
生成的DFD图能导出svg格式不?
广东省广州市 6F
Java依赖有点烦,能不能整成纯Python的?
印度尼西亚 B1
@ 幻想的翼 感觉这玩意挺适合做安全审计的。
河北省廊坊市 7F
那个lambda清理数据库的例子挺实用。
山东省潍坊市 8F
threats.json里还能自定义威胁?学废了。
安徽省合肥市 B1
@ 兔子跳 –exclude参数是忽略特定威胁吧?
北京市 B1
@ 兔子跳 自定义威胁是能加,但eval执行真不怕被投毒?
北京市 9F
我去,JSON里用eval也太危险了吧…
宁夏 B1
@ 孤独树洞 eval跑JSON?心都跳出来了😅
上海市 10F
要是能把PlantUML换成Mermaid就更好了 👍
陕西省西安市 B1
@ 二虎吧唧 Mermaid轻量多了,PlantUML还得装Java头疼。
湖北省黄冈市 11F
M1上跑不了Java 11有点抓瞎。
浙江省 12F
这框架能导出svg吗,png太糊了。
广西 B1
@ 霜华鬓 环境变量那个威胁例子挺典型。
湖南省永州市 13F
lambda那个例子能不能换成gRPC?
广东省广州市 B1
@ 墨鸦 gRPC那块得自己改Dataflow定义吧,没现成例子。
印度 14F
threats.json自定义威胁还挺灵活。
浙江省杭州市 15F
PlantUML要是换成Mermaid多好。
浙江省台州市 16F
感觉还行,就是依赖太重了。
日本 17F
JSON里exec代码是真敢写啊…
湖北省咸宁市 18F
新手问下,这个框架支持python哪个版本?
福建省漳州市 19F
看起来挺适合做课程项目。
北京市 20F
搞了半天终于跑通demo了。
浙江省宁波市 B1
@ FlexGod 恭喜啊,我第一次跑demo直接卡在plantuml路径上了😂
江苏省泰州市兴化市 21F
用起来感觉还行,就是文档有点少。
北京市 22F
不懂就问,啥叫数据边界?
马来西亚 23F
这工具能画时序图?
辽宁省沈阳市 24F
这玩意儿画图依赖太多,光配环境就劝退。
重庆市 25F
数据边界是不是指trust boundary啊?有点懵。
辽宁省沈阳市 26F
M1用户表示Java 11装得想砸电脑 😭
宁夏银川市 27F
威胁列表挺全的,覆盖了OWASP TOP10不少项。
浙江省嘉兴市 B1
@ Voidwhisper OWASP那几项是挺关键的
韩国 28F
导出svg有办法吗?png放大糊成马赛克。
湖北省黄石市 29F
之前踩过坑,Graphviz版本不对直接报错。
陕西省西安市 30F
threats.json里condition写错一个字母debug半小时。
广东省珠海市 31F
Lambda清理DB的例子能不能加个权限校验?
贵州省贵阳市 32F
文档要是再详细点就好了,现在全靠猜。
山东省青岛市 33F
这框架画图是挺好看,就是依赖太杂了。
印度 34F
threats.json里写condition太容易拼错了,搞崩两次了。
湖北省武汉市 35F
数据边界应该就是trust boundary吧?求确认。
贵州省贵阳市 36F
Lambda例子加个权限校验会更贴近实际场景。
上海市 37F
导出只能png真的很不方便,缩放全是锯齿。
台湾省 38F
用eval跑JSON谁敢在生产用啊,权限都不敢开。
湖南省衡阳市 39F
新手求助,python 3.8能用这个框架吗?
四川省绵阳市 40F
PlantUML换成Mermaid确实更轻量,支持一波。
江苏省徐州市 41F
之前搞过threat modeling,这工具算省事的了。
浙江省 42F
DFD图能不能加个颜色区分不同层级啊?
广东省潮州市湘桥区 43F
threats.json里的威胁库还挺全。