Back to skill

Security audit

U2-doc-parser

Security checks across malware telemetry and agentic risk

Overview

This skill is a disclosed document-conversion helper that uploads user-selected files to an external UniDoc service, so it is acceptable but not appropriate for sensitive documents.

Install only if you are comfortable sending selected documents to UniDoc's UAT servers. Do not use private, regulated, confidential, or business-sensitive files; check any UNIDOC_BASE_URL and UNIDOC_API_KEY values before running; install requests from a trusted Python environment; and avoid --force unless the output path is definitely disposable.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (13)

Tainted flow: 'EXPORT_URL' from os.getenv (line 33, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Content
headers['Authorization'] = f'Bearer {API_KEY}'

        params = {"fileId": file_id, "targetType": self.target_type}
        response = requests.get(
            url=EXPORT_URL,
            params=params,
            headers=headers,
Confidence
90% confidence
Finding
response = requests.get( url=EXPORT_URL, params=params, headers=headers, timeout=60 )

Tainted flow: 'SYNC_UPLOAD_URL' from os.getenv (line 31, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
with open(file_path, 'rb') as file:
            files = {'file': file}
            response = requests.post(
                SYNC_UPLOAD_URL,
                data=body,
                files=files,
Confidence
90% confidence
Finding
response = requests.post( SYNC_UPLOAD_URL, data=body, files=files, headers=headers, timeout=60 )

Tainted flow: 'ASYNC_UPLOAD_URL' from os.getenv (line 32, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
with open(file_path, 'rb') as file:
            files = {'file': file}
            response = requests.post(
                ASYNC_UPLOAD_URL,
                data=body,
                files=files,
Confidence
90% confidence
Finding
response = requests.post( ASYNC_UPLOAD_URL, data=body, files=files, headers=headers, timeout=60

Tainted flow: 'STATUS_URL' from os.getenv (line 34, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Content
raise TimeoutError("File conversion timed out after 5 minutes")

            params = {"fileId": file_id}
            response = requests.get(
                url=STATUS_URL,
                params=params,
                headers=headers,
Confidence
90% confidence
Finding
response = requests.get( url=STATUS_URL, params=params, headers=headers, timeout=30 )

Tainted flow: 'file_url' from requests.get (line 343, network input) → requests.get (network output)

Medium
Category
Data Flow
Content
if not isinstance(file_url, str) or not file_url.startswith(('http://', 'https://')):
            raise ValueError(f"Invalid file URL returned: {file_url}")

        content = requests.get(file_url, timeout=60).content.decode('utf-8')
        return content
Confidence
65% confidence
Finding
content = requests.get(file_url, timeout=60).content.decode('utf-8')

Natural-Language Policy Violations

Low
Confidence
86% confidence
Finding
This file’s human-readable guidance is predominantly in Chinese in authoring comments and function documentation, while the script is otherwise a general-purpose document parser rather than an explicitly region-specific tool. Under the stated policy, forcing a specific language without opt-in can be a natural-language locale violation.

Unsafe Defaults

Medium
Category
Tool Misuse
Content
func: str = "unisound",
    uid: Optional[str] = None,
    output_path: Optional[str] = None,
    skip_security_check: bool = False,
    force: bool = False
) -> str:
    """
Confidence
80% confidence
Finding
skip_security

Unsafe Defaults

Medium
Category
Tool Misuse
Content
:param func: 转换方法
    :param uid: 用户ID
    :param output_path: 输出文件路径(可选,不指定则输出到终端)
    :param skip_security_check: 跳过安全检查(不推荐)
    :param force: 强制覆盖已存在的输出路径
    :return: 转换后的内容
    """
Confidence
80% confidence
Finding
skip_security

Unsafe Defaults

Medium
Category
Tool Misuse
Content
:return: 转换后的内容
    """
    # 安全检查
    check_environment_security(skip_interactive=skip_security_check)

    # 验证输入文件
    validate_input_file(file_path)
Confidence
80% confidence
Finding
skip_security

Unsafe Defaults

Medium
Category
Tool Misuse
Content
)

    parser.add_argument(
        "--skip-security-check",
        action="store_true",
        help="Skip security warnings (not recommended)"
    )
Confidence
80% confidence
Finding
skip-security

Unsafe Defaults

Medium
Category
Tool Misuse
Content
args = parser.parse_args()

    # 安全警告(除非明确跳过)
    if not args.skip_security_check:
        print("\n" + "="*60, file=sys.stderr)
        print("⚠️  SECURITY WARNING", file=sys.stderr)
        print("="*60, file=sys.stderr)
Confidence
80% confidence
Finding
skip_security

Unsafe Defaults

Medium
Category
Tool Misuse
Content
func=args.func,
            uid=args.uid,
            output_path=args.output,
            skip_security_check=args.skip_security_check,
            force=args.force
        )
Confidence
80% confidence
Finding
skip_security

Unsafe Defaults

Medium
Category
Tool Misuse
Content
func=args.func,
            uid=args.uid,
            output_path=args.output,
            skip_security_check=args.skip_security_check,
            force=args.force
        )
Confidence
80% confidence
Finding
skip_security

VirusTotal

66/66 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.