9.

RTF(.rtf)完全ガイド — 制御文字・互換性・CVE-2017-0199 などのセキュリティ脆弱性

編集
この記事の要点
  • RTF (Rich Text Format) は 1987 年に Microsoft が策定した文書交換用フォーマット
  • 実体は ASCII テキスト + 制御文字 (\b, \i, \par など) — エディタで中身が読める
  • Word・WordPad・LibreOffice など主要ワープロが全て読み書きできる「最低限の共通言語」
  • バイナリではないが Markdown ほど人間可読ではなく、機械処理にも不向き
  • OLE 埋め込みなど拡張機能が攻撃ベクタになり、CVE-2017-0199 など重大な脆弱性が複数発見されている
  • 現代では DOCX が主役で、RTF は「相手の環境が不明な時の保険」として残っている

概要

RTF (Rich Text Format) は 1987 年に Microsoft が策定した文書交換用フォーマット。書式付き文書を「テキスト + 制御文字」で表現することで、異なるワープロソフト間で書式を保ったままやり取りできるよう設計された。

誕生から約 40 年が経過した今でも、Microsoft Word / WordPad / LibreOffice Writer / macOS TextEdit など、ほぼ全ての主要ワープロが読み書きをサポートする。一方、Word の主力は DOCX に移っており、RTF は「相手の環境が分からない時の保険」「Word を持たない相手にも書式を渡す手段」として残っているのが実情。

2008 年に Microsoft は RTF 仕様の更新を停止しており、Microsoft 365 では新規機能が反映されない。

内部構造

RTF は 制御文字付きの ASCII テキスト{ でグループを開始、\ から始まる制御語で書式を指定する。テキストエディタで開くとそのまま中身が見える。

{\rtf1\ansi\ansicpg932\deff0
{\fonttbl{\f0\fnil\fcharset128 MS Mincho;}}
{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}
\viewkind4\uc1
\pard\f0\fs24
これは普通のテキストです。\par
\b 太字\b0 と \i 斜体\i0 と \cf2 赤い文字\cf1 を含む。\par
}

主要な制御語の意味:

  • \rtf1 — RTF バージョン 1
  • \ansi / \ansicpg932 — 文字コード (cp932 = Shift_JIS)
  • \fonttbl — フォントテーブル
  • \b ... \b0 — 太字 ON / OFF
  • \i ... \i0 — 斜体 ON / OFF
  • \par — 段落区切り
  • ሴ5 — Unicode 文字 (10 進)
  • \cf2 — colortbl の 2 番目の色

主な用途

  • 互換性重視の文書交換 — 相手の環境 (Word / LibreOffice / WordPad) が不明な時
  • システムからの帳票出力 — メモ帳でも読めるリッチテキストを生成する用途
  • WordPad の既定保存形式 — Windows の標準軽量ワープロ
  • クリップボード経由の書式付き貼り付け — アプリ間で書式を維持してコピペする内部表現として OS が使う
  • 外部ツールから Word 文書生成 — DOCX を作るより RTF を組み立てるほうが単純で軽い

関連形式との比較

形式仕様提供実体書式編集容易性セキュリティ
RTFMicrosoft (1987-2008)制御文字付きテキストありテキストエディタで可過去に重大脆弱性多数
DOCXMicrosoft / ISOZIP + XMLあり専用ツール推奨VBA マクロは要注意
DOC (旧)Microsoftバイナリあり専用ツール必須マクロ脆弱性
TXTプレーンテキストなしテキストエディタで可原則安全
Markdownプレーンテキスト軽量マークアップテキストエディタで可原則安全
HTMLW3Cマークアップテキストありテキストエディタで可JS 実行に注意

編集・パーサ・ツール

Python では striprtf でテキスト抽出、pyth や独自パーサで構造的に処理する。pandoc も RTF を読み書きできる。

# RTF からプレーンテキスト抽出
from striprtf.striprtf import rtf_to_text

with open('document.rtf', 'r', encoding='utf-8') as f:
    rtf = f.read()
text = rtf_to_text(rtf)
print(text)
# pandoc で相互変換
pandoc document.rtf -o document.docx
pandoc document.rtf -o document.md
pandoc document.md -o document.rtf

# unrtf で RTF -> HTML / TXT
unrtf --html document.rtf > document.html
unrtf --text document.rtf > document.txt

注意点・落とし穴

  • セキュリティ脆弱性が多発した過去 — RTF の OLE オブジェクト埋め込み・外部リンク機能が攻撃ベクタとなり、CVE-2017-0199 (HTA 経由でリモートコード実行) や CVE-2017-11882 (数式エディタの脆弱性) など、メール添付の RTF を開くだけで PC が乗っ取られる重大脆弱性が複数発見されてきた
  • 不審な .rtf は開かない — Word の保護ビューを必ず有効化する。社内ポリシーで .rtf 添付を遮断するケースもある
  • 文字コードの罠 — 日本語 RTF は cp932 (Shift_JIS) で出力されることが多く、UTF-8 環境で文字化けする
  • 仕様更新停止 — 2008 年以降 Microsoft は RTF 仕様を更新していない。新しい Word 機能 (リボン的な装飾) は RTF には反映されない
  • 機械処理に不向き — テキストではあるが制御文字との混在で、安定したパースが難しい。大量解析が必要なら DOCX か Markdown に変換してから扱う
  • サイズ効率が悪い — 同じ内容でも DOCX の数倍になることがある

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. PDF(.pdf)
  2. CSV(.csv)
  3. Markdown(.md)
  4. TXT(.txt)
  5. DOCX(.docx)
  6. XLSX(.xlsx)
  7. PPTX(.pptx)
  8. TSV(.tsv)
  9. RTF(.rtf)
  10. ODT / ODS / ODP(.odt / .ods / .odp)

最近更新/作成されたページ