T09 · Insecure Skill Coding Practices
- Location
src/ppt_ooxml_tool/cli.py:218- Finding
Path Traversal Through the TSV File Field Permits Out-of-Root File Modification
- Content
View full analysis
Tuple[int, int]: rows = read_tsv(tsv_path) by_file_seq: Dict[Tuple[str, int], str] = {} for row in rows: file_rel = row["file"].strip() seq = int(row["seq"]) target = row.get("target", "") if target is None or target == "": continue by_file_seq[(file_rel, seq)] = target file_to_rows: Dict[str, List[int]] = {} for file_rel, seq in by_file_seq: file_to_rows.setdefault(file_rel, []).append(seq) files_changed = 0 texts_changed = 0 for file_rel, seqs in file_to_rows.items(): path = root / file_rel if not path.exists(): raise FileNotFoundError(f"Missing XML file from TSV: {file_rel}") content = path.read_text(encoding="utf-8") matches = list(A_TEXT_RE.finditer(content)) max_seq = len(matches) for seq in seqs: if seq < 1 or seq > max_seq: raise IndexError(f"Sequence out of range for {file_rel}: {seq} > {max_seq}") out: List[str] = [] last = 0 changed_this_file = 0 for i, m in enumerate(matches, start=1): out.append(content[last : m.start(1)]) key = (file_rel, i) if key in by_file_seq: original = m.group(1) translated = by_file_seq[key] escaped = xml_escape_text(translated) out.append(escaped) if escaped != original: changed_this_file += 1 else: out.append(m.group(1)) last = m.end(1) out.append(content[last:]) if changed_this_file > 0: path.write_text("".join(out), encoding="utf-8") ...[truncated 2428 chars]- Remediation
View remediation
