Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2016-12-06

【重要】TeXシステムの脆弱性の件

TeX システムの「外部コマンド実行設定」に関するセキュリティホールが報告されている。

既に W32TeXTeX Live(本家)の側での対策は行われている。ユーザが「TeX システムをアップデートする」などの対策をとる必要がある。

内容

  • TeX 処理系にはもともと「外部のソフトウェア(コマンド)」を実行する機能があるが、安全のため、既定では実行できる外部のコマンドを特定のもの(kpsewhich 等)に制限している。この状態を「制限付シェルエスケープ(restricted shell escape)」という。
  • しかしこの脆弱性のためその制限が実質的に無効になる。
  • つまり攻撃者が任意の外部コマンドを(ユーザの権限で)実行できるようになる。

影響範囲

以下の事項の全てを満たす場合に影響を受ける。

  • 2010 年頃以降にインストールされた TeX 配布。
    (※恐らくそのほとんど全てが該当する。)
  • 「制限付シェルエスケープ」の状態で使用している、またはその可能性がある。
    (※それが既定なので、ほとんどの人が該当する。)
  • 「制限付シェルエスケープ」での実行が許された外部コマンドの中に MetaPost のコマンド(mpost、jmpost、pmpost、upmpost)が含まれている。以後この状態を【無制限 MetaPost 連携可能】と呼ぶことにする。

以下の事項は関係しない。

  • エンジン(TeXpTeX、LuaTeX、…)の種類。
  • フォーマット(plain TeXLaTeX、…)の種類。*1
  • 自分が MetaPost を使う(自分で起動する)ことがあるか。
  • TeX 配布の新しさ。
    • たとえ(この記事から見て)未来のもの(例えば“2017 年の最新版”)でも、ユーザの設定によっては【無制限 MetaPost 連携可能】になる可能性がある。*2

検査方法

【無制限 MetaPost 連携可能】であるかを調べる方法。

  • コマンドシェルで以下のコマンドを実行する。
    kpsewhich -var-value=shell_escape_commands
    
  • 次のようなコマンド名のリストが表示されるはずである。
    (※これが「実行が許可された外部コマンド」のリストである。)
    (※何も表示されないならば【無制限 MetaPost 連携可能】ではない。*3
    bibtex,bibtex8,extractbb,kpsewhich,makeindex,mpost,repstopdf
    
  • リストの中に mpost、jmpost、pmpost、upmpost のいずれか が存在すれば【無制限 MetaPost 連携可能】である。
    • rmpost、rpmpost のように r で始まる名前のものは関係しない。*4

対処方法

  • 可能であれば TeX 配布を最新版にアップデートする。
    (※最新版では「実行が許可された外部コマンド」から MetaPost のコマンドを除外する修正がされている。しかしユーザ側でカスタムの設定がなされている場合は修正が反映されない可能性がある。)
  • アップデートした場合、再度上記の検査を行う。【無制限 MetaPost 連携可能】でない状態になっていればOK。
  • まだ【無制限 MetaPost 連携可能】である場合、「MetaPost のコマンドを、『実行が許可された外部コマンド』のリストから外す」処置を行う。
    • TeX Live本家など、tlmgrコマンドが利用できる場合は、以下のコマンドを実行する。
      tlmgr conf texmf shell_escape_commands 「リスト」
      
      ここで「リスト」の部分は、検査の際に kpsewhich コマンドにより表示された「実行が許可された外部コマンド」のリストのうち、mpost、jmpost、pmpost、upmpost を(あれば)除外したものを指定する。
      (※例えば検査の箇所で示した例の場合は「リスト」は bibtex,bibtex8,extractbb,kpsewhich,makeindex,repstopdf である。)
    • tlmgrが利用できない場合は、以下の手順を行う。
      • 以下のコマンドを実行して、有効なtexmf.cnfファイルを探す。
        kpsewhich texmf.cnf
        
        ここで表示されるパス名が有効なtexmf.cnfである。
      • 有効なtexmf.cnfファイルの中に「shell_escape_commands=」で始まる行がある場合は、「=」の後にあるコマンド名のリスト*5(「実行が許可された外部コマンド」と一致するはずである)から mpost、jmpost、pmpost、upmpost を(あれば)削除する
      • shell_escape_commands=」で始まる行がない場合は、適当な位置(例えば末尾)に以下の行を書き込む。
        shell_escape_commands=「リスト」
        
        ここで「リスト」の部分は、「実行が許可された外部コマンド」のリストのうち、mpost、jmpost、pmpost、upmpost を(あれば)除外したものを指定する。

補足

  • 今回の件は“攻撃者が構成したMetaPostのコマンド行”が原因となっている。自分でMetaPostのコマンドを実行する分には何の問題もない。

*1:厳密にいうと、“tex”というコマンド(Knuth オリジナルの plain TeX)だけはシェル実行が完全に禁止されているのでこの問題は起きない。ただこれが実用されていることはないだろう。

*2:要するに TeX や MetaPost 自身の問題ではなく“設定”の問題であるため。

*3:「制限付シェルエスケープ」が実装される以前の TeX システムと考えられる。

*4:これらは「TeX と安全に連携できる特別な MetaPost」のコマンド名である。

*5:ここで、行末の「\」は行継続を表す。すなわち、その「\」が無くてかつ次の行と繋がっているのと同じと見なされる。

2016-12-01

なんとかアドベントがはじまった ― ¥begin{texadvent2016}


 
TeX & LaTeX Advent Calendar
 

2016/12/01 〜 2016/12/25
〜ホンキでTeXを語ろう〜

TeX & LaTeX アドベントカレンダー 2016

*  *  *

TeX 界のおける年末の恒例イベントとなってしまった(?)アドベントカレンダーが今年も始まりました。

重点テーマ

今年の重点テーマはコレです。

ホンキでTeXを語ろう

えーと、昨年が「キホン」だったので、今年は「ホンキ」です。ただそれだけです。深い意味はありません。(ええっ)

※例によって、重点テーマは「必須」ではありませんあらゆる TeX ネタを歓迎しております。

で、初日のネタは

こちらになります。

最後の方がグダグダでアレですが、その辺はご勘弁を……。

まだ参加できます!

TeX & LaTeX Advent Calendar 2016(#texadvent2016)は

まだまだ参加者募集中です。

LaTeX なネタ、TeX 言語なネタ、MetaPost なネタ、mendex なネタ、Biber なネタ、expl3 なネタ、Kpathsea なネタ、ナントカなネタ、その他なんでも、お持ちの方はぜひぜひ、

ご参加おねがいします!

今年は例年になく早いペースで登録が進んでいて、もう空席が残りわずかとなっています。登録はお早めに!

2016-11-20

去年のアレ(アレアレ)を振り返ってみる

ステマ


 
TeX & LaTeX Advent Calendar
 

2016/12/01 〜 2016/12/25
〜ホンキでTeXを語ろう〜

TeX & LaTeX アドベントカレンダー 2016
参 加 者 募 集 中 !

*  *  *

昨年(2015 年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。

12/01zr_tex8r完全攻略! LaTeX 命令の“引数の規則”
12/02wtsnjp\relax の使い方 12連発
12/03p_typo今さら人に聞けないローマ数字とその組み方
12/04alg_d射の合成をするための命令を定義してみる
12/05neruko3114LaTeXで得られる出力をMSWordのそれに近付けようとするために
12/06tex-ut-tex今さらながら otftotfm を使ってみた
12/07515hikaruTeX & LaTeX Advent Calendar 2015 7 日目
12/08senopenTeXにはまらないための基本
12/09p_typo今さら人に聞けないLaTeXの入門書の選び方
12/10abenorixcolorパッケージ
12/11mattskalaLaTeXで文章の空白の植字をしましょう
12/12MNukazawa書体見本誌をTeXで連結して作った話
12/13aminophenTeX でゆきだるまを“もっともっと”たくさん
12/14kuroky_plusLaTeXの相互参照はいつでも解決(収束)するのか?
12/15okomokTeX で関数型プログラミング
12/16doraTeX\mathchoice の闇
12/17あざらしtcolorboxの基本
12/18VoD今さら人に聞けないMETAFONT
12/19umireonPGFPlotsでキホン的なグラフを書く
12/20hak7a3\csnameの挙動
12/21termoshtt今さら人に聞けない、Beamerの基本
12/22u_riboRユーザーがLaTeXユーザーと仲良くするべき理由
12/23doraTeX☃ゆきだるまで素因数分解を可視化しよう!☃
12/24golden_luckyRe:VIEWな原稿のためのTeXフォーマットを作ってみたよ
12/25zr_tex8rLaTeX の「アレなデフォルト」 傾向と対策
\Finalezr_tex8r今年も Merry TeXmas! ― \end{texadvent2015}

というわけで、今年はこれをゼンゼン参考にせずに、自分が素敵だと思うネタを全力でぶつけていきましょう!

2016-11-12

今年も畢竟 TeX で Advent Calendar する件について

やる!!

TeXLaTeX Advent Calendar 2016

とっておきの TeXLaTeX ネタを皆で持ち寄って楽しむ
TeXLaTeX Advent Calendar」
今年で 5 回目の開催となります。
皆さんの、心をこめたネタをお待ちしております!
ハッシュタグは「 #texadvent2016
TeXLaTeX 初心者大歓迎。 (重要)

TeXLaTeX 初心者大歓迎。 (超重要)

昨年は「TeX のキホン」が重点テーマでしたが、今年はコレです!

今年の重点テーマ

今年の重点テーマはコレです。
「ホンキでTeXを語ろう」

昨年は「キホン」でしたが今年は「ホンキ」です。
TeX/LaTeXについては普段はテキトウに語ることが多くなりがちですが、
たまには本気を出して解説・賞賛・愚痴・詠唱などしてみてはいかがでしょうか。

ホンキにもいろんなものがあります。

  • ホンキで LaTeX
  • ホンキで TeX 言語
  • ホンキで MetaPost
  • ホンキで \expandafter
  • ホンキで tlmgr
  • ホンキで TeX グッバイ
  • ホンキで某ナントカ

クリエイティブに考えましょう。

例によって「重点テーマ」は「制限」ではありません。

(前略)……以下の何れかテーマに該当する何かを書きます。

  • 「ホンキでTeXを語ろう」に大いに関連する TeXLaTeX ネタ。
  • 「ホンキでTeXを語ろう」に少しく関連する TeXLaTeX ネタ。
  • 「ホンキでTeXを語ろう」に全く以て関連しない TeXLaTeX ネタ。

このように、以前と同じく、TeX に関連するもの(LaTeX、plain TeX、ConTeXt、TeX Live、TeXworks、METAFONT、MetaPost、BibTeX、Asymptote、MakeIndex、……)なら何でも構いません。

皆さんの、心温まる TeX ネタで寒い冬を乗り越えましょう☃!

2016-11-11

LaTeX で 1TeX なロゴをする話

といっても、これで何事もなく終わってしまうと、熱狂的な 1TeX ファンが嘆き悲しむことになるだろう。なので、軽いネタを出しておく。

1TeX なロゴをするパッケージ

周知のとおり、1TeX は極めて画期的なフォーマットである。しかし余りに画期的過ぎるがゆえ、広く普及するには至っていない。そして、その影響は 1TeX のロゴにも表れている。TeXLaTeX のロゴについては標準の LaTeX においてそれを出力する命令(\TeX\LaTeX)が用意されている。また比較的新しいエンジンである XeTeX や LuaTeX のロゴについては metalogo や hologo などのパッケージを利用すれば出力できる。ところが、1TeX の(画期的な)ロゴについては、その知名度の低さのため、それをサポートするパッケージが存在しないのである。

この悲しむべき事態を打破するため、作ってみた。

% pdfLaTeX document
\documentclass[a4paper]{article}
\usepackage{bxtexlogo}
\bxtexlogoimport{*,**}% 全部インポートする
\begin{document}
I like {\SuyahTeX}, but I like {\OneTeX} better.
\end{document}
f:id:zrbabbler:20161111002606p:image

このパッケージは多くの “TeX 的”なロゴの実装を定義しているが、それを実際に使うには \bxtexlogoimport 命令により使いたいものをインポートする必要がある。ここでは引数を“*,**”としている(2 行目)が、“*”は「チョット有名なもの(XeTeX とか upTeX とか)全部」、“**”は「チョット無名なもの(残念ながら 1TeX はこちらに入る)全部」を表す。これにより 1TeX のロゴを出す命令 \OneTeX が使えるようになる。

\bxtexlogoimport引数には、命令の名前(\OneTeX 命令なら OneTeX)を書いて個別のロゴ命令をインポートすることもできる。例えば次の例では「チョット有名なやつ全部と、あと \OneTeX」をインポートしている。

% LuaLaTeX 文書; UTF-8
\documentclass[a4paper]{ltjsarticle}
\usepackage{bxtexlogo}
\bxtexlogoimport{*,OneTeX}% メジャーなやつと1TeXだけ
\begin{document}

{\upLaTeX}{\OneTeX}をよく使っています。

この文書は{\LuaLaTeX}だけど。

\end{document}
f:id:zrbabbler:20161111002605p:image
イタリックする場合

イタリックフォントが指定された状態で 1TeX のロゴを使う場合には注意がいる。1TeX ロゴの「1」の書体は本来は数式用のものであり、本来はイタリックや斜体がサポートされていない。このため、bxtexlogo だけを読みこんだ状態では、1TeX のロゴが非常に残念なことになってしまう。

% pdfLaTeX document
\documentclass[a4paper]{article}
\usepackage{bxtexlogo}
\bxtexlogoimport{OneTeX}% \OneTeX したい!
\begin{document}
\itshape % イタリック指定
Happy {\OneTeX}ing!!
\end{document}
f:id:zrbabbler:20161111002604p:image

幸いなことに bxtexlogo にはこれを補正する機能がある。graphicx パッケージが読み込まれている場合にこの補正が有効になり、1TeX の素敵なロゴを出力できるようになる。

% pdfLaTeX document
\documentclass[a4paper]{article}
\usepackage{graphicx}
\usepackage{bxtexlogo}
\bxtexlogoimport{OneTeX}% \OneTeX したい!
\begin{document}
\itshape % イタリック指定
Happy {\OneTeX}ing!!
\end{document}
f:id:zrbabbler:20161111002603p:image