APISIX 安全评估

背景

有大佬已经对 [apisix攻击面](https://ricterz.me/posts/2021-07-05-apache-apisix-attack-
surface-research.txt)做过总结。

本文记录一下自己之前的评估过程。

分析过程

评估哪些模块?

首先我需要知道要评估啥,就像搞渗透时,我得先知道攻击面在哪里。

1655139044-912745-image

根据文档,可以知道apisix项目包括很多系统,包括:* 网关* dashboard* ingress控制器* 各种sdk

sdk即使有漏洞,攻击场景也感觉有限,所以没有评估。

"ingress控制器"需要结合k8s中的网络来做评估,因为时间有限,所以只是粗略看了一下。

我主要看了网关和dashboard两个系统。

1655139086-278505-image

从文档上很容易看出来,网关有三个重要的模块:* 插件* admin api* control api

对于api来说,首先要检查的是"身份认证"和"鉴权"这两个安全措施。

apisix历史漏洞绝大部分都出现在插件中,所以插件属于"漏洞重灾区"。

评估api安全性:身份认证和鉴权

admin api实现如下:* admin api 使用token做认证,token是硬编码的。这个问题已经被提交过漏洞,官方应该不打算修复。* admin api 鉴权上,设计了viewer和非viewer两种角色。viewer角色只允许get方法。

靶场见 [Apache APISIX
默认密钥漏洞(CVE-2020-13945)](https://github.com/vulhub/vulhub/blob/master/apisix/CVE-2020-13945/README.zh-
cn.md)

control api是没有身份认证的,但是有两个点限制了攻击:* 默认它只在本地监听端口* 插件无关的control api只有"读信息"的功能,没有发现啥风险点

插件创建的control api是一个潜在的攻击面,不过我没找到啥漏洞。

评估插件安全性

因为插件默认都是不开启的,所以虽然它是重灾区,但是我并没有投入过多精力去审计。

不过在这里确实发现了一个安全问题,报告给官方后,分配了[CVE-2022-25757](https://www.openwall.com/lists/oss-
security/2022/03/28/2)。

下面来说一下这个安全问题。

CVE-2022-25757

这个安全问题是什么?

request-validation插件可以检查HTTP请求头和BODY内容,当不符合用户配置的规则时,请求就不会转发到上游。

比如用户按照如下规则配置时,body_schema限制请求中必须要有string_payload参数,并且是字符串类型,长度在1到32字节之间。curl http://127.0.0.1:9080/apisix/admin/routes/10 -H ‘X-API-KEY: edd1c9f034335f136f87ad84b625c8f1’ -X PUT -d ‘{“uri”: “/10”,“plugins”: {“request-validation”: {“body_schema”: {“type”: “object”,“required”: [“string_payload”],“properties”: {“string_payload”: {“type”: “string”,“minLength”: 1,“maxLength”: 32}}}}},“upstream”: {“type”: “roundrobin”,“nodes”: {“192.168.2.189:8888”: 1}}}’

但是恶意用户发送如下请求时,有可能绕过限制POST http://127.0.0.1:9080/10…{“string_payload”:“”,“string_payload”:“1111”}

为什么会绕过限制?

request-
validation.lua中使用cjson.safe库解析字符串为json对象,对于带有"重复键值"的json,它会取最后面的值。比如{"string_payload":"","string_payload":"1111"},request-
validation插件会认为string_payload=“1111”。local _M = {version = 0.1,decode = require(“cjson.safe”).decode,}

但是有很多流行的库,对于带有"重复键值"的json,它会取最前面的值,因此{"string_payload":"","string_payload":"1111"}会被认为string_payload=“”。

因此request-validation插件和上游服务在解析json时可能存在差异性,所以会导致限制被绕过

哪些库和request-validation插件在解析"重复键值json"时存在差异?

根据 <https://bishopfox.com/blog/json-interoperability-
vulnerabilities>文章,可以知道最起码以下库和request-validation插件在解析"重复键值json"时存在差异。

154656153-4b9c253b-e1af-47c3-9dfb-1fe40a922c3f

选取其中的gojay库做了验证,程序打印gojay而不是gojay2package mainimport "github.com/francoispqt/gojay"​type user struct {id intname stringemail string}// implement gojay.UnmarshalerJSONObjectfunc (u *user) UnmarshalJSONObject(dec *gojay.Decoder, key string) error {switch key {case “id”:return dec.Int(&u.id)case “name”:return dec.String(&u.name)case “email”:return dec.String(&u.email)}return nil}func (u *user) NKeys() int {return 3}​func main() {u := &user{}d := []byte({"id":1,"name":"gojay","email":"gojay@email.com"},"name":"gojay2")err := gojay.UnmarshalJSONObject(d, u)if err != nil {//log.Fatal(err)}println(u.name);// 取最前面的key的值,也就是gojay,而不是gojay2}

总结

评估思路比较简单:* 识别攻击面* api关注身份认证和鉴权* 插件关注业务逻辑

openresty配置中的api也是攻击面,下一篇再写。

说一个题外话:apisix的插件机制提供了很好的扩展能力,再加上openresty的高性能,或许拿来做waf架构很合适。

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【点下方卡片】免费领取:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot项目打包war配置详解

Springboot项目打包war配置详解 1. 排除内置tomcat依赖2. 添加servlet依赖3. 修改打包方式4. 修改主启动类5. 完整pom.xml6. 效果图 1. 排除内置tomcat依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

xmind latex【记录备忘】

xmind latex 换行 换行必须要有\begin{align}和\end{align}&#xff0c;此时再在里面用\才能换行&#xff0c;如果只写112\224是不能换行的

七、Kafka源码分析之网络通信

1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器&#xff0c;首先得从 Deque 里找到自己的目标分区&#xff0c;如果没有就新建一个批量消息 Deque 加进入 2、消…

【Windows】不要让你的win键落灰!掌握常用的组合快捷键,使用电脑更高效了

Windows 操作系统提供了丰富的键盘快捷键&#xff0c;能够大幅提高工作效率和操作便利性。在此介绍一些与 Win 键相关的常用快捷键&#xff0c;帮助你更好地利用 Windows 系统。想要在使用电脑时更高效吗&#xff1f;掌握常用的组合快捷键&#xff0c;让你的 Win 键从此不再落灰…

Security+备考我想分想这几点

考试初衷 本人是一名信息安全从业者&#xff0c;听过很多信息安全方面的认证&#xff0c;如CISP、CISSP、CISA&#xff0c;但是没听过Security认证&#xff0c;偶然的机会&#xff0c;我的同事给我介绍了谷安&#xff0c;从这里我才了解到还有Security认证这么一个信息安全认证…

微服务——http客户端Feign

目录 Restemplate方式调用存在的问题 Feign的介绍 基于Feign远程调用 Feign自定义配置 修改日志方式一(基于配置文件) 修改日志方式二(基于java代码) Feign的性能优化 连接池使用方法 Feign_最佳实践分析 方式一: 方式二 实现Feign最佳实践(方式二) 两种解决方案 Re…

通过v-for生成的input无法连续输入

部分代码&#xff1a;通过v-for循环生成el-form-item&#xff0c;生成多个描述输入框 更改之前的代码&#xff08;key绑定的是item&#xff09;&#xff1a; <el-form-item class"forminput" v-for"(item,index) in formdata.description" :key"…

【C语言】文件操作

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

建立TCP连接的各个系统调用

TCP 连接的过程图 服务器 socket() 函数 socket() 返回的 sockfd 是一个描述符。socket()对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字&#xff0c;而socket()用于创建一个socket描述符&#xff08;socket descriptor&#xff09;&#xff0c;它唯一标识…

ks webdid 滑块注册

web和app其实都一样&#xff0c;主要是针对于设备进行风控&#xff0c;web设备叫webdid; webdid注册出来&#xff0c;过了ks滑块激活&#xff0c;测试了主页&#xff0c;评论等接口都可以跑&#xff0c;平均也就2s注册一个&#xff0c;如果开并发那就更快了&#xff1b; 不过一…

hdvp.

hdvp:外部函数文件&#xff0c;函数定义在hdvp中可以传输给任何hdev使用&#xff0c;即可以发给别人使用。同时允许对hdvp进行加密

Mac 四大常用清理软件推荐,软件特色下载教程横向评测

Mac 一般来说基本是不会中毒的&#xff0c;而且像 现在的 windows 也是很少中毒&#xff0c;但我们可能还是需要一款杀毒清理软件&#xff0c;主要是为了清理垃圾&#xff0c;统一查看并管理软件开机自启、权限信息等&#xff0c;统一卸载清理等功能&#xff0c;另外我们可能还…

【python】在matlab中调用python

参考 Matlab调用Python - 知乎 (zhihu.com) 说一下我犯的错误&#xff1a; 1、电脑上有没有python都可以&#xff0c;我以为anaconda里的python不行&#xff0c;又重新下了一个python3.8 实际上导入的时候可以用 pyversion(D:\myDownloads\anaconda\envs\pytorch38\pytho…

SpringCloud学习路线(10)——分布式搜索ElasticSeach基础

一、初识ES &#xff08;一&#xff09;概念&#xff1a; ES是一款开源搜索引擎&#xff0c;结合数据可视化【Kibana】、数据抓取【Logstash、Beats】共同集成为ELK&#xff08;Elastic Stack&#xff09;&#xff0c;ELK被广泛应用于日志数据分析和实时监控等领域&#xff0…

【LangChain】检索器之上下文压缩

LangChain学习文档 【LangChain】检索器(Retrievers)【LangChain】检索器之MultiQueryRetriever【LangChain】检索器之上下文压缩 上下文压缩 LangChain学习文档 概要内容使用普通向量存储检索器使用 LLMChainExtractor 添加上下文压缩(Adding contextual compression with an…

AI视频监控综合管理平台EasyCVR多分屏默认播放协议的配置优化

智能视频监控平台EasyCVR可拓展性强、开放度高&#xff0c;既能作为业务平台使用&#xff0c;也能作为视频能力层被调用和集成。视频监控综合管理平台兼容度高&#xff0c;支持自由调用、支持与第三方集成。在AI能力的接入上&#xff0c;TSINGSEE青犀视频平台可支持AI智能分析网…

奇舞周刊第500期:TQL,巧用 CSS 实现动态线条 Loading 动画

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ TQL&#xff0c;巧用 CSS 实现动态线条 Loading 动画 最近&#xff0c;群里有个很有意思的问题&#xff0c;使用 CSS 如何实现如下 Loading 效果&#xff1a; leaferjs&#xff0c…

STM32MP157驱动开发——LED 驱动( GPIO 子系统)

文章目录 编写思路GPIO子系统的LED驱动程序(stm32mp157)如何找到引脚功能和配置信息在设备树中添加 Pinctrl 信息leddrv.cledtest.cMakefile编译测试 编写思路 阅读&#xff1a;STM32MP157驱动开发——GPIO 和 和 Pinctrl 子系统的概念可知利用GPIO子系统去编写LED驱动&#x…

机器学习深度学习——softmax回归从零开始实现

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——向量求导问题 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 …

全网最牛,Jmeter接口自动化-读取用例执行并结果回写(详细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、环境准备 下载…