Wikibooks jawikibooks https://ja.wikibooks.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 MediaWiki 1.47.0-wmf.24 first-letter メディア 特別 トーク 利用者 利用者・トーク Wikibooks Wikibooks・トーク ファイル ファイル・トーク MediaWiki MediaWiki・トーク テンプレート テンプレート・トーク ヘルプ ヘルプ・トーク カテゴリ カテゴリ・トーク Transwiki Transwiki‐ノート TimedText TimedText talk モジュール モジュール・トーク Event Event talk 高等学校化学基礎/物質の構成 0 19284 304784 300453 2026-10-17T06:00:41Z Nermer314 62933 304784 wikitext text/x-wiki {{pathnav|高等学校の学習|高等学校理科|高等学校化学|[[高等学校 化学基礎|化学基礎]]|pagename=物質の構成|frame=1|small=1}} このページでは、物質が何からできているか、またそれらがどのように構成されているかを扱う。物質と元素、物質の分類、原子の構造と周期表、分子とイオン、物質を構成する粒子による物質の分類の順に学ぶ。 == 物質と元素 == 化学とは、物質同士の反応を扱う学問であり、その知識によって自然観察の視野を広げることを目標としている。本節では、その基礎である物質と元素について述べる。 === 物質とはなにか === 物の呼び方として、'''物質'''という言葉がある。物質とは、次の二つの事柄を満たすものをいう。 # 一定の空間を占め、質量を有するもの。 # 人間によって認知できるもの。 例えば、プラスチックは物質であり、鉄も物質である。これらは上の二つの事柄を満たす。しかし、虹や映像は物質ではない。虹はあくまで人間の網膜に光が届くことで認識されるものでしかない。映像も、単なる光学現象に過ぎない。物質は、現象ではない。ただし、虹を見せる原因になっている空気中の水滴などは物質である。また、映像を見せるスクリーンやモニターも物質である。同様に、夢や時間といった観念も物質ではない。人の考えなどによって生み出された観念は、空間を占めず、質量も持たない。 === 物質の要素 === {| class="wikitable" style="float: right; text-align: center; margin: 2pt;" |- ! style="text-align: center;" | 番号 !! 名称 !! 元素記号の例 |- | 1 || 水素 || <chem>H</chem> |- | 6 || 炭素 || <chem>C</chem> |- | 7 || 窒素 || <chem>N</chem> |- | 8 || 酸素 || <chem>O</chem> |- | 16 || 硫黄 || <chem>S</chem> |- | 20 || カルシウム || <chem>Ca</chem> |- | 26 || 鉄 || <chem>Fe</chem> |- | 29 || 銅 || <chem>Cu</chem> |- | 47 || 銀 || <chem>Ag</chem> |- | 79 || 金 || <chem>Au</chem> |} これら物質は、'''元素'''と呼ばれる'''基本要素'''が組み合わさることでできていることがわかっており、また、'''原子'''という'''基本構造'''が組み合わさることによって構成されていることもわかっている。それでは、元素について、基本的な事柄を知ろう。 元素は、現在では118種類見つかっており、それぞれに名前と、原子番号、元素記号が割り当てられている。元素記号はラテン語、英語、ドイツ語の元素名から1文字または2文字を取って表される。一文字目は必ず大文字であり、二文字目は必ず小文字である。物質を表す際には、2つ以上の元素記号を並べて書くことがあるので(「分子とイオン」の節を参照)、大文字と小文字を正しく使い分ける。代表的な元素の元素記号を右の表に示す。表の番号は、[[#原子の分類|原子の分類]]で定義する原子番号である。詳しい元素記号の表は、[[元素記号]]を参照。 == 物質の分類 == 物質は、どのような元素がどのように集まっているかによって異なる。個々の物質を構成する元素については、以後の節で扱う。本節では、元素の組み合わさり方による'''物質の分類'''を述べる。 === 単体と化合物 === 物質は元素から構成されている。元素の組み合わさり方によって、物質は単体と化合物に分けることができる。 一種類の元素のみから構成されている物質を'''単体'''という。鉄は鉄元素のみからなる単体であり、水素は水素元素のみからなる単体である。ダイヤモンドも、炭素元素が結びついた単体である。炭素の単体には黒鉛やフラーレンなどが存在する。鉄や銅、水素、酸素、窒素など、代表的な単体が存在する元素は、その単体の名前が元素名になっていることがある。 単体に対して、二種類以上の元素から構成されている物質を'''化合物'''という。水(<chem>H2O</chem>)は<chem>H</chem>元素と<chem>O</chem>元素からなる分子から構成されている化合物である。他にも、酸化銅(II)(<chem>CuO</chem>)や、塩化アルミニウム(<chem>AlCl3</chem>)など、多くの種類がある。これらの言葉は、物質を、その要素となる元素の集まり方に着目して分類している。単体か化合物かのどちらかに属する物質を純物質という。 ; 単体と元素の区別 「酸素」「水素」のような名前は、単体を指す場合と、元素を指す場合とがある。具体的な性質をもつ物質そのものを指すときは単体、物質を構成する成分を指すときは元素である。 {| class="wikitable" ! 文 !! 下線の語が指すもの !! 理由 |- | 空気には、体積で約21%の<u>酸素</u>が含まれる。 || 単体 || 気体の物質 <chem>O2</chem> そのものを指している |- | 水は、水素と<u>酸素</u>からなる。 || 元素 || 水の成分を指している。水の中に <chem>O2</chem> が混ざっているわけではない |- | <u>酸素</u>は、ものが燃えるのを助ける。 || 単体 || 物質 <chem>O2</chem> の性質を述べている |- | 骨や歯には、<u>カルシウム</u>が多く含まれる。 || 元素 || 骨や歯には、金属のカルシウム(単体)が含まれるのではなく、化合物の成分としてカルシウムが含まれる |} 単体の中には、同じ元素から成るにもかかわらず、性質の異なるものがある。これらを互いに'''同素体'''という。たとえば、同じ部品の組木細工でも、組み合わせ方によって全体の形が大きく変わる。同様に、同じ元素から成る単体でも、原子の組み合わさり方によって性質が大きく変わる。 主な同素体は次の表の通りである。 {| class="wikitable" style="text-align:center;" !元素 !そのおもな同素体 !身近な例 |- | rowspan="3" |硫黄 <chem>S</chem> | style="width: 160px;" | 斜方硫黄 | style="text-align: left;" | 斜方晶系と呼ばれる形の結晶になっている硫黄。常温で最も安定な形である |- | 単斜硫黄 | style="text-align: left;" | 単斜晶系と呼ばれる形の結晶になっている硫黄。融かした硫黄をゆっくり冷やすと得られるが、常温では時間とともに斜方硫黄に変わる |- | ゴム状硫黄 | style="text-align: left;" | 加熱して溶けた硫黄を水の中に流し込むなどして瞬間的に凝固させた硫黄。ゴムのような弾性をもつ |- | rowspan="2" |炭素 <chem>C</chem> | style="width: 160px;" | 黒鉛 | style="text-align: left;" | 鉛筆の芯 |- | ダイヤモンド | style="text-align: left;" | 非常に硬く、モース硬度(引っかき硬度)が高い |- | rowspan="2" |酸素 <chem>O</chem> |酸素 |style="text-align: left;" | 大気中に多く存在する |- |オゾン |style="text-align: left;" | 成層圏のオゾン層に多く存在する |- | rowspan="2" |リン <chem>P</chem> |黄リン |style="text-align: left;" |自然発火する |- |赤リン |style="text-align: left;" | マッチ箱の側面に使われる |} この表にあげた同素体を持つ4つの元素 <chem>S, C, O, P</chem> は、SCOP(スコップ)と覚えることがある。<gallery> ファイル:GraphiteUSGOV.jpg|黒鉛 ファイル:DiamanteEZ.jpg|ダイヤモンド </gallery> {{clear}} 炭素の同素体には、上表にあげたもの以外にも、'''フラーレン'''や'''カーボンナノチューブ'''などが知られている。 <gallery widths=200px heights=200px> ファイル:Fullerene-C60.png|フラーレン<chem>C60</chem> の球棒モデル File:Types of Carbon Nanotubes.png|カーボンナノチューブの幾何学構造図。アームチェアチューブ、ジグザグチューブ、カイラルチューブの3種類に分けられる。 </gallery> {{clear}} === 純物質と混合物 === ; 純物質 : 物質が単体か一種類の化合物であるとき、その物質を'''純物質'''と呼ぶ。 純物質は、物理的操作(叩く、引っ張る、ろ過する、といった操作)によってそれよりも小さい構成パターンに分けることができないようなパターンの集まりだと考えられる。ここで言うパターンとは、元素の組み合わせのことである。単体や化合物は、物理的な操作だけではその構成を変えることができない。例えば、水は蒸発させても凍らせても叩いてもろ過しても、水のままである。しかし、電気分解を行うことで水素と酸素に分解できることは、中学校で学習した通りである。叩く、ろ過するなどの操作を物理的操作、電気分解のように物質の構成を変える操作を化学的操作と呼ぶ。 ; 混合物 : 純物質に対して、物理的操作によって分類できる可能性がある物質を、'''混合物'''という。 混合物は、単体や化合物が混ざり合っている物質である。液体や気体が容易に想像できるが、固体にも混合物は多く存在する。多くの岩石は混合物である。火成岩にさまざまな鉱物が含まれていることは、中学校で学習した通りである。鉱物ひとつひとつは、一部には不純物が含まれることはあるものの基本的には純物質であり、それらが集まってできている火成岩は混合物である。ほかにも、塩酸は塩化水素(<chem>HCl</chem>)と水(<chem>H2O</chem>)の混合物であるなど、混合物は非常に多い。 <small>補足:純物質と混合物の定義は、直観的に理解しておけばよい。ただし、ある物質が純物質か混合物かは、判断できるようにしておく。</small> 純物質は、融点・沸点・密度などが物質ごとに一定の値を示す。たとえば、1気圧のもとで、純粋な水は0 ℃で凍り、100 ℃で沸騰する。これに対して混合物は、成分の割合によって融点や沸点が変わり、また沸騰している間にも温度が少しずつ変化することが多い。このことを利用して、ある物質が純物質か混合物かを調べることができる。 === 混合物の分離と精製 === 混合物から目的の物質を取り出す操作を'''分離'''といい、不純物を取り除いて、より純度の高い物質を得る操作を'''精製'''という。分離・精製には、成分の性質(粒子の大きさ、沸点、溶解度など)の違いを利用する。 {| class="wikitable" ! 操作 !! 利用する性質の違い !! 方法 !! 例 |- | '''ろ過''' || 粒子の大きさ || ろ紙などを用いて、液体とそれに溶けない固体を分ける || 砂の混じった水から砂を取り除く |- | '''蒸留''' || 沸点 || 液体を加熱して生じた蒸気を冷却し、再び液体として取り出す || 海水から純粋な水を得る |- | '''分留'''(分別蒸留) || 沸点 || 沸点の異なる複数の液体の混合物を、蒸留によって各成分に分ける || 原油からガソリン、灯油、軽油などを得る。液体空気から窒素と酸素を得る |- | '''再結晶''' || 溶解度の温度による変化 || 高温で溶かした溶液を冷却し、溶解度の差を利用して純粋な結晶を析出させる || 少量の塩化ナトリウムを含む硝酸カリウムから、硝酸カリウムを得る |- | '''昇華法''' || 昇華しやすさ || 固体を加熱して直接気体にし、冷却して再び固体として取り出す || ヨウ素と砂の混合物からヨウ素を得る |- | '''抽出''' || 溶媒への溶けやすさ || 目的の物質をよく溶かす溶媒を用いて、その物質だけを溶かし出す || 茶葉から湯で茶の成分を溶かし出す。ヨウ素を含む水溶液から、ヘキサンを用いてヨウ素を取り出す |- | '''クロマトグラフィー''' || ろ紙などへの吸着されやすさ || 吸着のされやすさの違いによって成分の移動する速さが異なることを利用して、成分を分ける || 水性ペンのインクに含まれる色素を分ける |} {| style="border:2px solid aqua;width:80%" cellspacing=0 |style="background:aqua"|'''例題1 分離・精製の操作''' |- |style="padding:5px"| 次の混合物から、( )内の物質を取り出すのに最も適した操作を答えよ。 # 食塩水(水) # 泥水(水) # 少量の硫酸銅(II)を含む硝酸カリウム(硝酸カリウム) |} {{解答|例題1の解答}} # 蒸留。塩化ナトリウムは蒸発しないので、加熱して生じた水蒸気を冷却すると、純粋な水が得られる。 # ろ過。泥の粒子は水に溶けていないので、ろ紙を通らない。 # 再結晶。硝酸カリウムは温度による溶解度の変化が大きいので、熱い水に溶かして冷却すると、純粋な硝酸カリウムの結晶が析出する。少量の不純物は、溶液中に残る。 {{証明終わり}} === 成分元素の検出 === 物質にどのような元素が含まれているかは、その元素に特有の反応を利用して調べることができる。 ; 炎色反応 ある種の元素を含む物質を炎の中に入れると、その元素に特有の色が炎に現れる。これを'''炎色反応'''という。花火の色は、炎色反応を利用している。 {| class="wikitable" style="text-align:center;" ! 元素 !! <chem>Li</chem> !! <chem>Na</chem> !! <chem>K</chem> !! <chem>Ca</chem> !! <chem>Sr</chem> !! <chem>Ba</chem> !! <chem>Cu</chem> |- ! 炎の色 | 赤 || 黄 || 赤紫 || 橙赤 || 紅(深赤) || 黄緑 || 青緑 |} ; 沈殿の生成など * 塩素 <chem>Cl</chem> の検出: 試料の水溶液に硝酸銀水溶液を加えると、塩化銀 <chem>AgCl</chem> の白色沈殿が生じる。 *: <chem>Ag^+ + Cl^- -> AgCl</chem> * 炭素 <chem>C</chem> の検出: 試料を燃焼させて生じた気体を石灰水に通すと、石灰水が白く濁る。炭素が燃焼して生じた二酸化炭素と、石灰水中の水酸化カルシウムが反応して、水に溶けにくい炭酸カルシウムが生じるためである。 *: <chem>Ca(OH)2 + CO2 -> CaCO3 + H2O</chem> * 水素 <chem>H</chem> の検出: 試料を燃焼させて生じた液体を、白色の硫酸銅(II)無水塩 <chem>CuSO4</chem> につけると、青色に変わる。これにより、水が生じたこと、すなわち試料に水素が含まれていたことがわかる。 === 物質の構成による分類 === ここまでに述べた単体、化合物、混合物を、次の表にまとめる。右側の列には具体例を示す。 {| class="wikitable" style="text-align:center;" |- ! style="width: 260px;" colspan="3" | 物質の構成 ! style="width: 400px;" | 具体例 |- | rowspan="3" | 物質 | rowspan="2" | 純物質 | 単体 | style="text-align: left;" | 鉄(<chem>Fe</chem>)、水素(<chem>H2</chem>)、酸素(<chem>O2</chem>)など |- | 化合物 | style="text-align: left;" | 水(<chem>H2O</chem>)、酸化銅(II)(<chem>CuO</chem>)など |- | colspan="2" | 混合物 | style="text-align: left;" | 食塩水(水と塩化ナトリウム)、海水、空気、岩石など |- |} == 物質を構成する原子 == 物質は元素から成り立っている。元素は、物質を構成する成分の種類を表す語であり、「物質を構成している最小の粒」を表す語ではない。物質は原子という粒子によって構成されており、元素という要素によって成立している。 物質は、'''原子'''と呼ばれる、陽子・中性子・電子といったより小さな粒子が集まった構造を持つ粒で構成されている。物質は原子という小さな構造から作られていると考えることができる。 ; 原子 : 物質を構成する基礎的な構造を持った粒子。 原子が物質を構成する粒子であるのに対し、元素は物質がどんな性質のものの集まりであるかを示す。「水は水素元素と酸素元素からできている」というのは「水が水素という基本要素と酸素という基本要素から成り立っている」という意味である。この、基本要素とは原子の種類のことでもあるため、元素と原子は非常に意味が似ている。 意味が似ている上に、日本語では音も似ているため、しばしば混同されるが、両者は別の概念である。英語では、元素は「element」、原子は「atom」と、異なる単語で表される。元素は世界を形作る要素のことであり、原子は物質を構成する粒子である。元素は構成しているものの種類のようなものを指すのに対し、原子はそれ自体分類の意味を含まず、単に最小の粒の意味にとどまっている。これが、元素と原子の意味の違いである。 実際には、元素は原子の種類を表す語であるという認識が普通である。また、発見当初は最小単位だと思われていた原子は、陽子・中性子・電子というさらに小さな粒子からできあがっていて(陽子と中性子も、さらに小さな粒子からなる)、最小の単位ではないことがわかっている。しかし、通常の化学反応や物質の性質を見ていく中で、それらの内部構造まで考える必要はないので、ここでは扱わない。 <small>素粒子については[[高等学校物理/原子物理]]で扱う。</small> <small>原子と元素の違いは、次のように整理できる。元素は原子の種類(陽子の数で決まる)であり、原子は物質を構成する粒子一つ一つである。たとえば、水分子 <chem>H2O</chem> 1個には、水素原子2個と酸素原子1個が含まれ、水は水素元素と酸素元素からなる。</small> 基本的に、原子がいくつか結びつきあうことで'''分子'''が生じ、原子や分子が電荷をもつことで'''イオン'''が生じる。これらの語を簡単に定義する。分子やイオンも物質を構成する単位である。 ; 分子 : 1個以上の原子が結びついてできた、物質の性質を保つ粒。 ; イオン : 電荷を帯びた原子や分子。 == 原子の構造 == 原子とは、物質を構成する粒子一粒の呼び名である。膨大な数の原子が相互に結び付きあって、私たちの体や、他の様々なものは形作られている。原子そのものも、陽子・中性子・電子といった粒子が構造的に結びついて構成されているが、化学では、原子を基本単位としてその性質を分析していく。 <small>元素と原子の違いについては[[#物質を構成する原子|物質を構成する原子]]を参照。</small> 原子はあまりに小さいため、特殊な電子顕微鏡などを用いなければ観察することができない。その直径は約100億分の1メートル<small>( <math>1 \times 10^{-10}\ \mathrm{m} = 0.1\ \mathrm{nm}</math> )</small>である。つまり、原子を約1億個並べて、ようやく1 cmの長さになる。 === 原子の基本構造 === [[Image:Helium atom (not to scale).svg|frame|right|<chem>He</chem>原子のボーアモデル]] 原子は、中心にある'''原子核'''と、その周りに存在するいくつかの'''電子'''(図では黄色)の構造である。原子の構造は複雑であるが、高等学校の化学では、ボーアの原子模型と呼ばれるモデルを使って理解する。右に示した図は、ヘリウム原子(<chem>He</chem>)のボーアモデルである。ボーアモデルでは、原子の化学的な性質をすべて説明することはできない。その意味でこのモデルは不十分であるが、高等学校の化学の範囲では、このモデルで十分に内容を扱える。原子の構造は、このモデルを用いて述べる。 まず、原子の構造の要素である原子核と、陽子・中性子・電子について述べる。これらは高等学校化学で扱う最も小さな粒子である。 ; 原子核 : 陽子と中性子の塊である。正の電荷を持っている。 ; 陽子 : 原子核を構成する粒子の一つ。陽子一粒が、<math>+e</math> の電荷を持っている(<math>e</math> は電気素量である)。 ; 中性子 : 原子核を構成する粒子の一つ。ただし、中性子だけでは原子核にはならない。電荷は0である。 ; 電子 : 原子核の周りを回る軽い粒子。<math>-e</math> の電荷を持っている。 右に示した図で言えば、真ん中の赤い粒が陽子、おなじく真ん中の黄緑色の粒が中性子、周りにある黄色い粒が電子である。全ての原子は、このような「原子核の周りに電子」という構造をしていると考えられている。 <small>補足:「考えられている」というのは、原子があまりに小さく、直接観察することができないためである。科学者がさまざまな実験・考察を積み重ね、それらを総合的に判断した結果、「原子は中心に原子核、周囲には電子という構造をしている」ととらえるのが最も妥当だと考えられている。このことについては、ウィキペディアの[[w:原子#原子論の歴史|原子論の歴史]や[[w:ラザフォード散乱|ラザフォード散乱]]に記事があるので、詳しくは、これらを参照。</small> === 電子殻と価電子 === [[Image:Electron shell 008 Oxygen (diatomic nonmetal) - no label.svg| thumb |200px| 酸素原子<chem>O</chem>は、K殻に2個、L殻に6個(価電子)の電子を持つ。]] [[File:Electron shell 001 Hydrogen (diatomic nonmetal) - no label.svg|thumb|200px| 水素原子<chem>H</chem>は、K殻に1個(価電子)の電子を持つ。]] ここでは、原子の構造のうち、電子が並んでいる原子核の周りの部分について、より詳しく述べる。 ; 電子殻 : 電子が入っている層全体を指す。'''階層構造'''になっている。 この電子殻は何重かにわかれており、内側から'''K殻'''、'''L殻'''、'''M殻'''、……と呼ぶ。基本的に電子は内側の電子殻から入っていく。それぞれの層に入ることのできる電子の数は決まっており、その数以上の電子が一つの層に入ることはない。たとえば、K殻に入ることのできる電子の数は2つまでである。内側から数えて<math>n</math>番目の電子殻に入ることのできる電子の数は、<math>2n^2</math>個である。 また、いちばん外側の電子殻にある電子を'''最外殻電子'''と呼ぶ。最外殻電子は化学反応などにおいて重要な役割を担うため原子の性質に大きな影響を与える。ある原子とある原子との接点が、実際には最も外側の電子殻であるため、原子の結合にはこの最外殻電子の個数が重要になってくる。原子の性質を決める最外殻電子を特別に'''価電子'''と呼ぶ。 <chem>He, Ne</chem> のように、最外殻にそれ以上電子が入ることのできない状態を'''閉殻'''という。閉殻になっている原子や、<chem>Ar</chem>のように最外殻に8個の電子をもつ貴ガス原子の価電子の個数は'''0'''であると約束する。 [[File:Electron shell 002 Helium - no label.svg|thumb|left|200px| ヘリウム原子<chem>He</chem>は、K殻に2個の電子を持つ。ヘリウムは閉殻構造である。閉殻であるから、ヘリウムの価電子は0と数える。]] 各々の原子の電子の、電子殻への配列の仕方を'''電子配置'''という。K殻に2個の電子が全て収められた場合の電子配置は、貴ガスであるヘリウム<chem>He</chem>の電子配置と同じである。L殻まで電子が全て収められ、L殻に8個の電子とK殻に2個の電子の合計10個の電子が全て収められた場合の電子配置は、貴ガスであるネオン<chem>Ne</chem>の電子配置と同じである。 同様に、K殻に2個、L殻に8個、M殻に8個の電子が収められた状態は、貴ガスであるアルゴン<chem>Ar</chem>の電子配置と同じである(M殻には最大18個まで入るので、M殻はまだ満たされていないが、最外殻に8個の電子をもつ安定な電子配置である)。 原子番号1〜20の原子の電子配置を、次の表にまとめる。原子番号19のカリウム <chem>K</chem> と20のカルシウム <chem>Ca</chem> では、M殻が18個に満たないうちに、N殻に電子が入る。 {| class="wikitable" style="text-align:center;" ! 原子番号 !! 元素 !! K殻 !! L殻 !! M殻 !! N殻 !! 価電子の数 |- | 1 || <chem>H</chem> || 1 || || || || 1 |- | 2 || <chem>He</chem> || 2 || || || || 0 |- | 3 || <chem>Li</chem> || 2 || 1 || || || 1 |- | 4 || <chem>Be</chem> || 2 || 2 || || || 2 |- | 5 || <chem>B</chem> || 2 || 3 || || || 3 |- | 6 || <chem>C</chem> || 2 || 4 || || || 4 |- | 7 || <chem>N</chem> || 2 || 5 || || || 5 |- | 8 || <chem>O</chem> || 2 || 6 || || || 6 |- | 9 || <chem>F</chem> || 2 || 7 || || || 7 |- | 10 || <chem>Ne</chem> || 2 || 8 || || || 0 |- | 11 || <chem>Na</chem> || 2 || 8 || 1 || || 1 |- | 12 || <chem>Mg</chem> || 2 || 8 || 2 || || 2 |- | 13 || <chem>Al</chem> || 2 || 8 || 3 || || 3 |- | 14 || <chem>Si</chem> || 2 || 8 || 4 || || 4 |- | 15 || <chem>P</chem> || 2 || 8 || 5 || || 5 |- | 16 || <chem>S</chem> || 2 || 8 || 6 || || 6 |- | 17 || <chem>Cl</chem> || 2 || 8 || 7 || || 7 |- | 18 || <chem>Ar</chem> || 2 || 8 || 8 || || 0 |- | 19 || <chem>K</chem> || 2 || 8 || 8 || 1 || 1 |- | 20 || <chem>Ca</chem> || 2 || 8 || 8 || 2 || 2 |} {| style="border:2px solid aqua;width:80%" cellspacing=0 |style="background:aqua"|'''例題2 電子配置と価電子''' |- |style="padding:5px"| 原子番号16の硫黄 <chem>S</chem> の電子配置と、価電子の数を答えよ。 |} {{解答|例題2の解答}} 電子の数は原子番号と等しく、16個である。K殻に2個、L殻に8個が入り、残りの : <math>16 - 2 - 8 = 6</math> 個がM殻に入る。したがって、電子配置はK殻2個、L殻8個、M殻6個であり、価電子の数は6である。 {{証明終わり}} <gallery widths=250px heights=250px> File:Electron shell 011 Sodium.svg |ナトリウム原子<chem>Na</chem>は、K殻に2個、L殻に8個、M殻に1個(価電子)の電子を持つ。 File:Electron shell 017 Chlorine.svg| 塩素原子<chem>Cl</chem>は、K殻に2個、L殻に8個、M殻に7個(価電子)の電子を持つ。 </gallery> {{clear}} ---- === 電荷 === 以後の節で必要になる概念である'''電荷'''について、ここで簡単に説明する。 ; 電荷 : 粒子が持つ電気的な性質の強さ。プラスの量とマイナスの量があり、0の場合もある。 電荷を持った粒子は、基本的に次の性質を持つ。 * 同じ符号の電荷を持った粒子同士は反発する力が働く。 * 逆の符号の電荷を持った粒子同士は引き合う力が働く。 * 電荷を持った粒子同士に働く力は、距離が近いほど大きくなる。 ある原子核に陽子が3つ含まれているとき、原子核全体の電荷は : <math>+e \times 3 = +3e</math> と表される。さらに、この原子核の周りに電子が3つ回っているならば、原子全体の電荷は、 : <math>(+3e) + (-3e) = 0</math> となる。これは、原子全体では電荷を持っていないということである。このことがらを利用すれば、原子全体の電荷や、原子の名称などから、それにいくつの陽子や電子が含まれているかを計算することができる。 == 原子に関する諸概念 == === 原子の分類 === 原子の性質は、その原子の原子核に含まれる陽子の数で決まる。これは、原子の性質が、電子や周囲の原子とどのように結びつくかによって決まるからである。プラスの電荷はしりぞけあうため、原子核同士は容易に衝突はしない。しかし、電子は原子核に引き寄せられる。 元素の分類、つまり原子がどの元素に属するかの判断は、その原子の原子核に含まれる陽子の数によって行われている。例えば、水素(<chem>H</chem>)に属する原子の場合、それに含まれる陽子の数は必ず1個である。同じように、炭素(<chem>C</chem>)に属する原子の原子核には、必ず6個の陽子が含まれている。逆に、ある原子の原子核に陽子が6個含まれるなら、その原子は炭素である。 このように、ある原子の原子核に含まれる陽子の数がわかれば、その原子がどの元素に属するかもわかる。逆に、ある原子がどの元素に属するのかがわかれば、その原子の原子核に含まれる陽子の数がわかる。よって、ひとつひとつの元素に分類される原子について、そこに属する原子の陽子の数を元に番号を付けることができる。こうしてつけられた番号を、'''原子番号'''と呼ぶ。原子番号は <chem>_{6}C</chem> のように、原子の左下に小さく書いて示す。原子番号は多くの場合において省略される。 <small>補足:炭素に属する原子を炭素原子、あるいは単に炭素などと呼ぶ。よって、「炭素」という言葉が元素としての炭素を指し示す場合もあれば、原子一粒としての炭素を指し示す場合もある。一般的には、炭素と言えば原子の方を指す。これは、元素と原子が同一視されやすい原因の一つである。また、[[#物質の要素|物質の要素]]の表にある番号は、この原子番号である。元素の番号は、その元素に属する原子の原子核に含まれる陽子の数と一致する。元素記号も、多くの場合では、原子の分類を示す時に用いられる。</small> <div style="text-align: center;"> {| |- ! style="text-align:center;" colspan="2" | 原子番号と元素記号と陽子の数の対応の例 |- | {| class="wikitable" ! style="text-align:center; width: 80px;" | 原子番号 ! style="text-align:center; width: 80px;" | 元素記号 ! style="text-align:center; width: 200px;" | 元素名(原子名) ! style="text-align:center; width: 100px;" | 陽子の数 |- | 1 || <chem>_{1}H</chem> || 水素 || 1 |- | 2 || <chem>_{2}He</chem> || ヘリウム || 2 |- | 6 || <chem>_{6}C</chem> || 炭素 || 6 |} | {| class="wikitable" ! style="text-align:center; width: 80px;" | 原子番号 ! style="text-align:center; width: 80px;" | 元素記号 ! style="text-align:center; width: 200px;" | 元素名(原子名) ! style="text-align:center; width: 100px;" | 陽子の数 |- | 8 || <chem>_{8}O</chem> || 酸素 || 8 |- | 13 || <chem>_{13}Al</chem> || アルミニウム || 13 |- | 20 || <chem>_{20}Ca</chem> || カルシウム || 20 |} |- |} </div> === 原子の質量 === 原子は陽子、中性子、電子から構成されているため、これらの粒子の質量の総和が、原子全体の質量になる。電子の質量は小さい<small>(陽子の質量の <math>\dfrac{1}{1836}</math>。<math>9.10938 \times 10^{-31}\ \mathrm{kg}</math>)</small>が、陽子の質量は <math>1.67262 \times 10^{-27}\ \mathrm{kg}</math> で、中性子もほぼ同じ質量を持つ。このように桁の多い数値を用いて計算するのは煩雑である。陽子と中性子の質量はほぼ等しく、電子の質量はそれらと比べて無視できるほど小さいので、原子全体の質量は、おおよそ陽子と中性子の数の和で表すことができる。これを'''質量数''' と呼ぶ。質量数は <chem>^{12}C</chem> のように、原子の左上に小さく書いて示す。 原子を構成する粒子の性質を、次の表にまとめる。 {| class="wikitable" style="text-align:center;" ! 粒子 !! 電荷 !! 質量(kg) !! 質量の比 |- | 陽子 || <math>+e</math> || <math>1.673 \times 10^{-27}</math> || 1 |- | 中性子 || 0 || <math>1.675 \times 10^{-27}</math> || 1(陽子とほぼ等しい) |- | 電子 || <math>-e</math> || <math>9.109 \times 10^{-31}</math> || <math>\dfrac{1}{1836}</math> |} 電気素量 <math>e</math> は <math>1.602 \times 10^{-19}\ \mathrm{C}</math> である。 ; 質量数 : ある原子の原子核に含まれる陽子の数と中性子の数の和。 : 質量数を <math>M</math>、元素記号を <math>X</math> とすると、<chem>^{M}X</chem> のように書き表す。 質量数は、陽子と中性子の個数の和であり、質量そのものではないことに注意する。質量数はあくまで指標であり、実際の質量は厳密には異なる。原子の個数と実際の質量との関係については、[[高等学校化学基礎/物質量|物質量]]のページで述べる。 具体的には、ある原子の質量数が16で、その原子に中性子が8個含まれている場合、 : <math>16\ (\text{質量数}) - 8\ (\text{中性子の数}) = 8\ (\text{陽子の数})</math> より、8個の陽子が含まれていることがわかる。8個の陽子が含まれている原子は、酸素(<chem>O</chem>)である。 ;同位体 ある二つの原子について、原子番号が同じでも質量数が異なることがある。言い換えると、原子番号は陽子の数であるため、陽子の数が同じ二つの原子であっても、その原子核に含まれる中性子の数が違うことがある。 このような、同じ元素でも質量数のことなる原子を互いに'''同位体'''と呼ぶ。あるいは'''アイソトープ'''と呼ぶ。 なお、同位体は同素体と名前が似ているが、異なる概念である。 炭素<chem>C</chem>の代表的な同位体には、<chem>^{12}C</chem> と<chem>^{13}C</chem> がある。 炭素<chem>C</chem>の同位体には<chem>^{14}C</chem>も微量に存在するが、この<chem>^{14}C</chem>は不安定であり、半減期(半分が崩壊するまでの時間)5730年で少しずつ崩壊して、別の原子(窒素<chem>^{14}N</chem>)に変わる。原子核が壊れるとき、一般に放射線を出すので、不安定な同位体が壊れたときも放射線を出す。<chem>^{14}C</chem>も崩壊するときに放射線を出す。 <chem>^{14}C</chem>のような、不安定で崩壊して放射線を出す同位体を'''放射性同位体'''(ラジオアイソトープ)という。 これに対して安定して存在できる同位体を'''安定同位体'''という。 同位体であっても、安定な同位体の化学的な性質は、ほとんど等しい。なぜなら、それらの原子核に含まれる陽子の数が同じだからである。 他の多くの元素にも同位体は存在する。 たとえば水素<chem>H</chem>には、自然界には<chem>^{1}H</chem> と<chem>^{2}H</chem>がある。<chem>^{1}H</chem>の存在比率は、およそ99.99%である。<chem>^{2}H</chem>の存在比率は、およそ0.01%である。質量数2の水素<chem>^{2}H</chem>のことを{{ruby|重水素|じゅうすいそ}}あるいはジュウテリウム(deuterium)という。 質量数3の水素<chem>^{3}H</chem>も存在する(原子炉内などで生じるほか、宇宙線の作用により天然でもごく微量が生成する)。この水素<chem>^{3}H</chem>を'''三重水素(トリチウム)'''という。<chem>^{3}H</chem>は放射性同位体である。 なお、すべての元素に、自然界で同位体が存在するわけではない。 <chem>Be, F, Na, Al, P, Sc, Mn</chem> などは、天然に存在する安定同位体が1種類だけである(人工的につくられる放射性同位体は存在する)。 {| style="border:2px solid aqua;width:80%" cellspacing=0 |style="background:aqua"|'''例題3 同位体の粒子の数''' |- |style="padding:5px"| 塩素の同位体 <chem>^{35}_{17}Cl</chem> と <chem>^{37}_{17}Cl</chem> について、それぞれの陽子の数、中性子の数、電子の数を答えよ。 |} {{解答|例題3の解答}} 陽子の数は原子番号に等しく、どちらも17である。中性子の数は、質量数から陽子の数を引いて求める。 : <chem>^{35}Cl</chem>: <math>35 - 17 = 18</math> : <chem>^{37}Cl</chem>: <math>37 - 17 = 20</math> 原子は電気的に中性であるから、電子の数は陽子の数に等しく、どちらも17である。 {| class="wikitable" style="text-align:center;" ! 原子 !! 陽子の数 !! 中性子の数 !! 電子の数 |- | <chem>^{35}_{17}Cl</chem> || 17 || 18 || 17 |- | <chem>^{37}_{17}Cl</chem> || 17 || 20 || 17 |} 同位体どうしでは、陽子の数と電子の数が等しく、中性子の数だけが異なる。 {{証明終わり}} {{コラム|放射性同位体の利用|2=放射性同位体は、一定の割合で崩壊していく。ある放射性同位体の量が、はじめの半分になるまでの時間を'''半減期'''という。半減期は、温度や圧力、化合物の種類によらず、同位体ごとに決まっている。 大気中の二酸化炭素には、<chem>^{14}C</chem> がほぼ一定の割合で含まれている。生物は生きている間、光合成や食物によって炭素を取り込むので、体内の <chem>^{14}C</chem> の割合は大気と同じに保たれる。生物が死ぬと炭素の取り込みが止まり、体内の <chem>^{14}C</chem> は半減期5730年で減っていく。そのため、木片や骨などに残っている <chem>^{14}C</chem> の割合を測定すると、その生物が死んでからの年数を推定できる。この方法を'''放射性炭素年代測定'''という。たとえば、<chem>^{14}C</chem> の割合が大気中の <math>\dfrac{1}{4}</math> になっている木片は、 : <math>\dfrac{1}{4} = \left(\dfrac{1}{2}\right)^2</math> であるから、半減期の2倍、すなわち : <math>5730 \times 2 = 11460</math> 年ほど前に切られた木であると推定できる。 このほか、放射性同位体は、医療における診断や治療、農作物の品種改良、工業製品の検査などにも利用されている。}} === 周期表と周期律 === [[Image:Periodic table (polyatomic).svg|center|700px|周期表]] 元素を原子番号の順に並べると、性質のよく似た元素が周期的に現れる(例:1価の陽イオン<small>(→[[高校化学 化学結合|化学結合]])</small>になりやすい物質……<chem>_{3}Li, _{11}Na, _{19}K</chem> など。ここまでは8個間隔で現れている)。このことを元素の'''周期律'''という。 元素を原子番号の順に並べて、かつ周期律に併せて配列した表を'''[[元素記号|周期表]]'''という。周期表の縦の列を'''族'''といい、同族内では性質のよく似た元素が並ぶ。周期表の横の列を'''周期'''と呼び、周期の番号は電子殻の数と一致する。 「族」は、1族から18族までの、合計18個がある。「周期」は、第1周期から第7周期までの7つがある。 具体例をいくつか挙げると、族については、水素<chem>H</chem>とリチウム<chem>Li</chem>とナトリウム<chem>Na</chem>とカリウム<chem>K</chem>は、ともに1族の元素である。周期に関しては、水素<chem>H</chem>は第1周期、リチウム<chem>Li</chem>は第2周期、<chem>Na</chem>は第3周期である。 他の族の元素でも、例を挙げる。酸素<chem>O</chem>は、16族で第2周期の元素である。炭素<chem>C</chem>は14族で第2周期である。塩素<chem>Cl</chem>は17族元素で第3周期である。 族が同じ元素どうしを'''同族元素'''という。たとえば、<chem>H</chem>と<chem>Li</chem>と<chem>Na</chem>と<chem>K</chem>とルビジウム<chem>Rb</chem>とセシウム<chem>Cs</chem>とフランシウム<chem>Fr</chem>とは、お互いに同族元素である。 他の族でも例を挙げれば、14族の炭素<chem>C</chem>とケイ素<chem>Si</chem>、ゲルマニウム<chem>Ge</chem>、すず<chem>Sn</chem>、鉛<chem>Pb</chem>とは、お互いに同族元素である。 ;アルカリ金属 1族の同族元素のうち、水素<chem>H</chem>を除いた残りの元素の、<chem>Li</chem>と<chem>Na</chem>と<chem>K</chem>とルビジウム<chem>Rb</chem>とセシウム<chem>Cs</chem>とフランシウム<chem>Fr</chem>を、'''アルカリ金属'''という。<chem>H</chem>はアルカリ金属には含めない。 ;アルカリ土類金属 2族元素の、ベリリウム<chem>Be</chem>、マグネシウム<chem>Mg</chem>、カルシウム<chem>Ca</chem>、ストロンチウム<chem>Sr</chem>、バリウム<chem>Ba</chem>、ラジウム<chem>Ra</chem>を'''アルカリ土類金属'''という(ベリリウム<chem>Be</chem>とマグネシウム<chem>Mg</chem>を除いた2族元素をアルカリ土類金属とする場合もある)。 ;ハロゲン元素 17族の元素のフッ素<chem>F</chem>、塩素<chem>Cl</chem>、臭素<chem>Br</chem>、ヨウ素<chem>I</chem>、アスタチン<chem>At</chem>を'''ハロゲン元素'''という。 ;貴ガス元素 18族のヘリウム<chem>He</chem>、ネオン<chem>Ne</chem>、アルゴン<chem>Ar</chem>、クリプトン<chem>Kr</chem>、キセノン<chem>Xe</chem>、ラドン<chem>Rn</chem>を'''貴ガス元素'''という。(希ガス(「希」は「稀」の代用字)と表記されることもある) ;遷移金属 3族から12族の元素を'''{{ruby|遷移金属|せんいきんぞく}}'''という(12族を含めず、3族から11族とする場合もある)。 遷移金属は、価電子の数が1個または2個であることが多く、族と価電子数が一致しない。 ;典型元素 遷移金属以外の元素、すなわち1族・2族・13族〜18族の元素を'''典型元素'''という。典型元素では、族の番号の1の位の数が、最外殻電子の数と一致する(ただし、貴ガスは、ヘリウムの2個を除いて8個であり、価電子の数は0と数える)。 1族の元素と2族の元素は陽イオンになりやすい。 17族の元素は陰イオンになりやすい。 18族の元素は化合物をつくりづらい。天然には単原子分子で存在するのが一般的である。 <small>補足:</small>原子番号を <math>a</math>、質量数(核子の個数)を <math>b</math> とするとき、元素Aの原子を <chem>^{b}_{a}A</chem> のように書くことがある。 == 分子とイオン == 物質が元素という成分から成り立っていることは、[[#物質と元素|物質と元素]]で述べた通りである。しかし、物質が原子という小さな構造によって構成されているという側面もある。そこで、原子同士がどのような構造を形成して物質が形作られているのか、といった視点から物質を分けることもできる。高等学校化学では主に、'''イオンからなる物質'''、'''分子からなる物質'''、'''原子からなる物質'''の三種類を考える。 これらの物質に関して理解する前に、まず、物質を構成する原子の異なった姿である'''分子'''・'''イオン'''について述べる。 === 分子 === {| style="float: right; padding: 0px; margin: 4px;" |- ! style="text-align: center;" | 様々な分子のモデル |- | [[Image:Dioxygen-3D-vdW.png|thumb|center|120px|酸素分子のモデル]] |- | [[Image:Carbon-dioxide-3D-vdW.svg|thumb|center|120px|二酸化炭素のモデル]] |- | [[Image:Ammonia-3D-vdW.png|thumb|center|120px|アンモニアのモデル]] |- | [[Image:Acetone-3D-vdW.png|thumb|center|120px|アセトンと呼ばれる分子のモデル]] |- |} ; 分子 : 分子とは、物質としての性質を持った最小単位の一つである。 : 1つ以上の原子から成り立っている。 分子は電気的に中性であるため、これらが物理的に運動する限りにおいては、電磁気の問題は基本的に発生しない。 一般に分子は原子が複数個集まってできていることが多いが、ただ一つの原子だけで独立して分子となるものもある。貴ガスと呼ばれる種類の原子は、他の原子と結びつかず、独立で分子を構成する。 ; 単原子分子 : 一個の原子から構成されている分子。具体的にはヘリウム<chem>He</chem>やネオン<chem>Ne</chem>など。 ; 多原子分子 : 二個以上の原子から構成されている分子。たとえば水<chem>H2O</chem>や酸素<chem>O2</chem>など。 ある分子が、どのように原子が結びついてできているのかということを表記するとき、一般的には分子式を用いる。 以下に、様々な分子の例と、その分子式を示す。分子名はウィキペディアの各項目にリンクしているので、詳しい性質はそちらを参照。 {| class="wikitable" style="text-align: center;" |- ! 名称 !! 分子式 !! 分類 !! 簡単な性質 |- | [[w:水素|水素]] || <chem>H2</chem> || 多原子分子 || 常温で気体。 |- | [[w:酸素|酸素]] || <chem>O2</chem> || 多原子分子 || 常温で気体。物を燃やす働きがある。大気の21%がこの分子である。 |- | [[w:窒素|窒素]] || <chem>N2</chem> || 多原子分子 || 常温で気体。大気の78%がこの分子である。 |- | [[w:水|水]] || <chem>H2O</chem> || 多原子分子 || 常温で液体であり、固体(氷)や気体(水蒸気)にもなる。 |- | [[w:アンモニア|アンモニア]] || <chem>NH3</chem> || 多原子分子 || 刺激臭。水によく溶け、水溶液はアルカリ性を示す。 |- | [[w:二酸化炭素|二酸化炭素]] || <chem>CO2</chem> || 多原子分子 || 常温で気体。 |- | [[w:ネオン|ネオン]] || <chem>Ne</chem> || 単原子分子 || 貴ガスの一種。ネオンサインなどに利用される。 |- | [[w:アルゴン|アルゴン]] || <chem>Ar</chem> || 単原子分子 || 貴ガスの一種。大気の約0.9%がこの分子である。 |} {{-}} === イオン === {| style="float: right; padding: 0px; margin: 4px;" |- ! style="text-align: center;" | 様々なイオンのモデル |- | [[Image:Ammonium-3D-vdW.png|thumb|center|120px|アンモニウムイオン(<chem>NH4^+</chem>)のモデル]] |- | [[Image:Sulfate-3D-vdW.png|thumb|center|120px|硫酸イオン(<chem>SO4^2-</chem>)のモデル]] |- | [[Image:Hydronium-3D-vdW.png|thumb|center|120px|オキソニウムイオン(<chem>H3O^+</chem>)のモデル]] |- | [[Image:Sodium-chloride-unit-cell-3D-ionic.png|thumb|center|120px|塩化ナトリウム(<chem>NaCl</chem>)のモデル。ナトリウムイオン(<chem>Na^+</chem>)と塩化物イオン(<chem>Cl^-</chem>)が交互に並んでいる。]] |- |} 最外殻電子の数が8個(K殻のみ2個)である、貴ガスと同じ電子配置は、非常に安定した形である。原子は、電子を受け取ったり、他の原子に電子を渡したりして、この安定な電子配置になりやすい。原子は通常の状態であれば電荷的に中性だが、このように電子を渡したり受け取ったりして粒子全体として電荷をもつことがある。このように、電荷を持った粒子のことを'''イオン'''(ion)という。特に正の電荷を持つ粒子を'''陽イオン'''と言い、負の電荷を持つ粒子を'''陰イオン'''と言う。 ; 陽イオン : 正の電荷を持ったイオン。 ; 陰イオン : 負の電荷を持ったイオン。 価電子の少ない原子は、電子を失って陽イオンになりやすい。逆に価電子の多い原子は、電子を受け取って陰イオンになりやすい。このように失ったり受け取ったりした電子の数を、そのイオンの'''価数'''という。価数が1のときそのイオンは'''1価'''であるといい、以下2価、3価と数える。電子1個の電荷は <math>-e</math> であり、価数は電子1個分の電荷を単位として数える。 [[Image:Electron shell 011 Sodium.svg|180px]] [[Image:Electron shell 017 Chlorine.svg|180px]] 左の図はナトリウム原子(<chem>Na</chem>)のボーアモデルである。ナトリウムの原子番号は11であるため、K殻に2個、L殻に8個、M殻に1個の電子が含まれる。電子が11個あり、この時点では原子核の電荷 <math>+11e</math> と電子の電荷 <math>-11e</math> が相殺し合って、原子全体としては電荷的に中性である。しかし、価電子数が1で、貴ガスと同じ安定な電子配置を取れていない。右の図は塩素(<chem>Cl</chem>)のボーアモデルである。塩素の原子番号は17であるため、K殻に2個、L殻に8個、M殻に7個の電子が含まれる。これもやはり電荷的に中性であるが、貴ガスと同じ安定な電子配置を取れていない。最外殻電子の数、すなわち価電子数は7である。 [[Image:Legame ionico fra sodio e cloro.svg|400px]] ある条件のもとでは、この二つの原子の間で電子の受け渡しが起こる。上の図は、最外殻電子のみを描いたボーアモデルで、電子の受け渡しを表現したものである。ナトリウム原子は原子核の <math>+11e</math> と、1個少なくなった10個の電子による <math>-10e</math> で、全体として <math>+e</math> の電荷をもっていることになる。塩素は、ナトリウムから電子を一つ受け取って、全体で電子が一つ多いので、<math>-e</math> の電荷をもっていることになる。イオンは普通、このようにして作られると考えられている。また、<chem>NaCl</chem>全体で見れば電荷的に中性であり、ナトリウムイオンも、塩化物イオンも、ともに貴ガスと同じ安定な電子配置を取っている。 イオンとなった原子は、その元素記号の右上に価数と符号をつけることで表現する。このような表現法を'''イオン式'''という。 : <chem>Mg^2+</chem>:<small>2価の陽イオンとなったマグネシウム</small> これは、2価の陽イオンとなったマグネシウムをイオン式で表現したものである。価数の数字を先に、符号を後に書く。価数が1のときは、数字を省略して符号のみを付ける。 : <chem>H^+</chem>:<small>水素イオン</small> イオンは必ずしも一つの原子からなるわけではない。原子がいくつか集まった原子団<small>( もしくは、分子 )</small>も、電子の授受によってイオンになる。 ; 単原子イオン : 原子一粒が電子を受け取ったり渡したりしてイオンになったもの。 ; 多原子イオン : 二個以上の原子が結合した原子団に、電子が結合したり、取れたりしてできたもの。 : <chem>NH4^+</chem>:<small>アンモニウムイオン</small> : <chem>OH^-</chem>:<small>水酸化物イオン</small> <small>補足:単原子の陽イオンは、元素名に「イオン」を付けて呼ぶ(ナトリウムイオン <chem>Na^+</chem> など)。単原子の陰イオンは、元素名を「~化物イオン」に変えて呼ぶ(塩素 → 塩化物イオン <chem>Cl^-</chem>、酸素 → 酸化物イオン <chem>O^2-</chem> など)。多原子イオンには、アンモニウムイオン <chem>NH4^+</chem>、硫酸イオン <chem>SO4^2-</chem> のように、それぞれに決まった名前がある。</small> 主なイオンを、次の表にまとめる。 {| class="wikitable" style="text-align:center;" ! 価数 !! 陽イオン !! 陰イオン |- | 1価 || 水素イオン <chem>H^+</chem><br>ナトリウムイオン <chem>Na^+</chem><br>カリウムイオン <chem>K^+</chem><br>銀イオン <chem>Ag^+</chem><br>アンモニウムイオン <chem>NH4^+</chem> || 塩化物イオン <chem>Cl^-</chem><br>水酸化物イオン <chem>OH^-</chem><br>硝酸イオン <chem>NO3^-</chem><br>炭酸水素イオン <chem>HCO3^-</chem><br>酢酸イオン <chem>CH3COO^-</chem> |- | 2価 || マグネシウムイオン <chem>Mg^2+</chem><br>カルシウムイオン <chem>Ca^2+</chem><br>銅(II)イオン <chem>Cu^2+</chem><br>亜鉛イオン <chem>Zn^2+</chem><br>鉄(II)イオン <chem>Fe^2+</chem> || 酸化物イオン <chem>O^2-</chem><br>硫化物イオン <chem>S^2-</chem><br>硫酸イオン <chem>SO4^2-</chem><br>炭酸イオン <chem>CO3^2-</chem> |- | 3価 || アルミニウムイオン <chem>Al^3+</chem><br>鉄(III)イオン <chem>Fe^3+</chem> || リン酸イオン <chem>PO4^3-</chem> |} {| style="border:2px solid aqua;width:80%" cellspacing=0 |style="background:aqua"|'''例題4 イオンの電子配置''' |- |style="padding:5px"| マグネシウムイオン <chem>Mg^2+</chem> と酸化物イオン <chem>O^2-</chem> に含まれる電子の数をそれぞれ求め、それらがどの貴ガスの原子と同じ電子配置であるかを答えよ。 |} {{解答|例題4の解答}} マグネシウム原子(原子番号12)は電子を12個もつ。<chem>Mg^2+</chem> は電子を2個失っているので、電子の数は : <math>12 - 2 = 10</math> である。酸素原子(原子番号8)は電子を8個もつ。<chem>O^2-</chem> は電子を2個受け取っているので、電子の数は : <math>8 + 2 = 10</math> である。どちらも電子の数は10個(K殻2個、L殻8個)であり、ネオン <chem>Ne</chem> の原子と同じ電子配置である。 {{証明終わり}} {{-}} == 物質の構成 == これまでに述べた原子・分子・イオンという粒子を用いて、実際の物質がどのように構成されているかを述べる。この節の多くは具体的な物質の紹介であり、ウィキペディアへのリンクも付けた。分子の名称は、一般的に用いられているものを示す。ここで挙げた以外の名称で呼ばれる物質もある。 === 分子からなる物質 === [[Image:Carbon-dioxide-crystal-3D-vdW.png|thumb|120px|ドライアイスのモデル]] 分子は基本的に独立した一粒である。身近な例を挙げるなら、水や多くの気体などの構成単位は、分子である。分子が構成単位になっている結晶<small>( 固体 )</small>を'''分子結晶'''という。分子結晶は融点・沸点が低く、やわらかい。また電気を通さない。分子が規則正しく並んでいるのも、分子結晶の特徴である。 {| class="wikitable" style="text-align: center;" |- ! 物質の名前 !! 分類 !! 分子式 !! 簡単な性質 |- | [[w:水|水]] || 化合物 || <chem>H2O</chem> || イオンからなる物質を溶かす。氷は分子結晶である。 |- | [[w:ブドウ糖|ブドウ糖]] || 化合物 || <chem>C6H12O6</chem>||ショ糖(いわゆる砂糖)の成分。 |- | [[w:二酸化炭素|ドライアイス]] || 化合物 || <chem>CO2</chem> || 二酸化炭素の固体。温度があがると、液体にならずに一気に気体になる。 |} <small>補足:水は、実際には不純物を含んでいることが多い。純粋な水は天然には存在しない。</small> === イオンからなる物質 === <chem>NaCl</chem>(塩化ナトリウム)という化合物は、ナトリウムイオン<chem>Na^+</chem>と塩化物イオン<chem>Cl^-</chem>がお互いに偏った電荷を補い合おうとして結合する。このようにイオン同士がひきつけあってできた結合を'''イオン結合'''という。また、イオン結合によってできた固体を'''イオン結晶'''という。イオン結晶は融点・沸点が高く、硬いがもろい。これらは基本的にイオンが並んでできており、水に溶ければ容易にそれぞれのイオンに分かれる。そのため、固体のときは電気を通さないが、液体あるいは水に溶解した状態では電気をよく通すという性質を持っている。 {| class="wikitable" style="text-align: center;" |- ! 物質の名前 !! 分類 !! 組成式 !! 簡単な性質 |- | [[w:塩化ナトリウム|食塩]] || 化合物 || <chem>NaCl</chem> || 塩酸と水酸化ナトリウムを中和して得られる。 |- | [[w:酸化銅(II)|酸化銅]] || 化合物 || <chem>CuO</chem> || 銅を空気中で加熱すると得られる。水素と反応する。 |} === 原子からなる物質 === 原子からなる物質には、自由電子を共有する'''金属結合'''によってできるものと、'''共有結合'''によってできるものとがある。金属結合によってできた物質は'''金属光沢'''を持ち、熱や電気をよく通し、'''展性'''<small>( たたくと広がる性質 )</small>・'''延性'''<small>( 引っ張ると延びる性質 )</small>を持つ。また共有結合によってできた物質は硬く、融点が高い。例えば、ダイヤモンドは炭素原子が共有結合してできた物質である。 {| class="wikitable" style="text-align: center;" |- ! 物質の名前 !! 分類 !! 組成式 !! 簡単な性質 |- | [[w:鉄|鉄]] || 単体 || <chem>Fe</chem> || 身近な金属。 |- | [[w:銅|銅]] || 単体 || <chem>Cu</chem> || 身近な金属。10円硬貨の主成分(銅を主成分とする合金)。 |- | [[w:銀|銀]] || 単体 || <chem>Ag</chem> || よく知られている金属。電気をよく通す。 |- | [[w:金|金]] || 単体 || <chem>Au</chem> || よく知られている金属で、最上級のものをあらわすことに用いられる。金メダルなど。 |- | [[w:ダイヤモンド|ダイヤモンド]] || 単体 || <chem>C</chem> || 最も硬い鉱物。 |} 構成する粒子による物質の分類と、その固体(結晶)の性質を、次の表にまとめる。 {| class="wikitable" style="text-align:center;" ! 結晶の種類 !! 構成する粒子 !! 粒子間の結合 !! 融点 !! 硬さ !! 電気の伝導性 !! 例 |- | イオン結晶 || 陽イオンと陰イオン || イオン結合 || 高い || 硬いがもろい || 固体は通さない。液体や水溶液は通す || <chem>NaCl, CuO</chem> |- | 分子結晶 || 分子 || 分子間にはたらく弱い力 || 低い || やわらかい || 通さない || <chem>H2O</chem>(氷)、<chem>CO2</chem>(ドライアイス) |- | 共有結合の結晶 || 原子 || 共有結合 || 非常に高い || 非常に硬い || 通さない(黒鉛は通す) || <chem>C</chem>(ダイヤモンド)、<chem>SiO2</chem> |- | 金属 || 原子(金属の陽イオンと自由電子) || 金属結合 || 高いものが多い || 展性・延性がある || 通す || <chem>Fe, Cu</chem> |} <small>補足:この節で用いた「共有結合」「イオン結合」「金属結合」については、[[高等学校化学基礎/化学結合]]で詳しく扱う。ここでは、そのような種類がある、という理解にとどめる。</small> == 関連項目 == * [[高等学校化学基礎/化学結合]] * [[元素記号]](周期表) * [[wikipedia:ja:元素|元素]] * [[wikipedia:ja:元素の番号順一覧|元素の番号順一覧]] * [[wikipedia:ja:原子|原子]] * [[wikipedia:ja:分子|分子]] * [[wikipedia:ja:イオン|イオン]] [[カテゴリ:物質|ふつしつのこうせい]] f2zmueq75hzbclf7d5gnn9aqf9rhng9 高等学校古典B/漢文/侵官之害 0 21238 304783 291267 2026-10-17T01:51:02Z ~2026-55630-04 92807 /* 儒家と法家の対比 */ 304783 wikitext text/x-wiki 「侵官之害」は一般に「かんをおかすのがい」と読む。 {{ruby|越権行為|えっけんこうい}}は君主を無視して反乱などをすることにつながりかねない。だから、たとえ臣下が良かれと思ってやった行為であっても、越権行為であるなら、処罰しなければならない、という話である。 越権行為・・・与えられた職務上の権限を越えて事をおこなうこと。 これは{{ruby|韓非|かんぴ}}が説いたもので、著書『{{ruby|韓非子|かんぴし}}』に載っている<ref>後年の人々は彼のことを敬して韓非子と呼ぶ。ここでは、歴史上の人物は韓非、著書を『韓非子』とする。</ref>。 『韓非子』は、法律によって人を支配しなければならないという{{ruby|'''法家'''|ほうか}}の思想書である。 == あらすじ == 昔、{{ruby|韓|かん}}の{{ruby|昭侯|しょうこう}}が、酒に酔ったまま、寝てしまった。それを見ていた、王に冠をかぶせる係の側近が、王が風邪をひかないように、寝ている王に衣をかぶせてあげた。しかし、王は、この冠の係の者を罰した。また、衣の係の側近も罰した。 風邪を引くという一時的なことよりも、部下が他人の職分を侵すということのほうが、弊害が多い。 部下の仕事内容と役職とは、一致させなければならない。 == 本文 == {{#invoke:Kanbun|kanbun|col=15| \O昔む者{か し}、韓ノ昭侯酔ゑヒテ而寝いヌ。典冠ノ者見ル[二]君之寒キヲ[一]也、故ニ加フ[二]衣ヲ於君之上ニ[一]。覚メテ[レ]寝ヨリ而説よろこビ、問フ[二]左右ニ[一]曰ク、「誰カ加ヘシ[レ]衣ヲ者ゾト。」左右対ヘテ曰ク、「典冠ナリト。」 君因リテ兼ネ[三]㆐罪セリ典衣ト与ヲ[二]典冠[一]。其ノ罪セルハ[二]典衣ヲ[一]、以テ為セバ[レ]失フト[二]其ノ事ヲ[一]也。其ノ罪セルハ[二]典冠ヲ[一]、以テ[レ]為セバ[レ]越ユト[二]其ノ職ヲ[一]也。非ザル[レ]不ルニ[レ]悪にくマ[レ]寒キヲ也。以お為もヘラク侵ス[レ]官ヲ之害ハ甚ダシト[二]於寒キヨリモ[一]。故ニ明主之畜やしなフヤ[レ]臣ヲ、臣ハ不[レ]得[二]越エテ[二]官ヲ而有ルヲ[一レ]功、不[レ]得[二]陳のベテ[レ]言ヲ而不ルヲ[一レ]当タラ。越ユレバ[レ]官ヲ則チ死シ、不レバ[レ]当タラ則チ罪セラル。守リ[二]其ノ官ニ[一]、所ノ[レ]言フ者貞あたレバ也、則チ群臣不[レ]得[二]朋ほう党たうシ相為スヲ[一]矣。 }} ==白文== 昔者、韓昭侯酔而寝。典冠者見君之寒也、故加衣於君之上。覚寝而説、問左右曰、「誰加衣者」。左右対曰、「典冠」。君因兼罪典衣与典冠。其罪典衣、以為失其事也。其罪典冠、以為越其職也。非不悪寒也。以為、侵官之害、甚於寒。 故明主之蓄臣、臣不得越官而有功、不得陳言而不当。越官則死、不当則罪。守業其官、所言者貞也、則群臣不得朋党相為矣。 == 書き下し文 == :{{ruby|官|かん}}を{{ruby|侵|おか}}すの{{ruby|害|がい}} {{ruby|昔者|むかし}}、韓の昭侯{{ruby|酔|よ}}ひて{{ruby|寝|い}}ぬ。{{ruby|典冠|てんかん}}の者{{ruby|君|きみ}}の寒きを見るや、故に衣を君の上に加ふ。{{ruby|寝|しん}}より覚めて{{ruby|説|よろこ}}び、左右に問ひて曰はく、「誰か衣を加えし者ぞ」と。左右{{ruby|対|こた}}へて曰はく、「典冠なり」と。君{{ruby|因|よ}}りて{{ruby|典衣|てんい}}と典冠を罪せしは、以て其の職を超ゆと{{ruby|為|な}}せばなり。寒きを{{ruby|悪|にく}}まざるに非ず、以て官を侵すの害は寒きよりも甚だしと為せばなり。 故に明主の臣を{{ruby|蓄|やしな}}ふや、臣は官を超えて功有るを得ず、{{ruby|言|げん}}を{{ruby|陳|の}}べて当たらざるを得ず。官を超ゆれば則ち{{ruby|死|ころ}}され、当たらざれば則ち罪せらる。業を其の官に守り、言ふ所の者貞ならば、則ち群臣は朋党して相為すを得ず。 :(二柄) === 語彙 === :{{ruby|左右|さゆう}}⸺側近。 :{{ruby|誰|たれ}}⸺だれ。「'''た'''れ」と読むことに注意。「だれ」とは読まない。 ===語釈=== :{{ruby|韓昭侯|かんしょうこう}}⸺紀元前の戦国時代の{{ruby|韓|かん}}の国の君主。 :'''{{ruby|説|せつ、えつ}}'''⸺'''よろこ'''ぶ。漢語では「'''{{ruby|悦|エツ}}'''」と発音が同じであり、そのため、「悦」の「喜ぶ」という意味と同様に、「説」にも「喜ぶ」という意味がある。 :{{ruby|対|こたエテ}}⸺お答えする。目上のものに答える。 :{{ruby|典冠|てんかん}}⸺君主の冠を管理する役人。 :{{ruby|典衣|てんい}}⸺君主の衣服を管理する役人。 :{{ruby|因|よりテ}}⸺そのために。 :{{ruby|兼罪|かネテ つみせり}}⸺典衣と典冠の二人とも罰した。 :{{ruby|明主|めいしゅ}}⸺賢明な君主。すぐれた君主。 :{{ruby|貞|てい}}⸺正しいこと。忠実。 == 現代語訳 == :他人の職分を侵すことは害悪だ。 昔、韓の昭侯が、(酒に)酔って寝てしまった。そこで、冠を管理する役人が君主(昭侯)の寒そうな様子を見て、衣をかぶせた。 (昭侯は)眠りから覚めて喜び、側近に尋ねて、「誰が衣をかけてくれたのか。」と聞いた。 側近は答えて言った、「典冠です」。 君主はこれをきいて、典衣と典冠の両方とも罰した。 典衣を罰した理由は、自分の職務をしなかったからである。 典冠を罰した理由は、職務を超えたからである。 昭侯は、寒さを苦手としないわけではない。 昭侯は、他人の役職を侵すことが寒さよりも重大事だと考えたのである。 それゆえ、賢い君主が臣下を召しかかえるにあたり、臣下は役職を超えて行動するのは許されず、意見を述べたのに(言葉と行動とが)一致しないのも許されない。 官職を超えれば死刑にされ、意見を実行しなければ処罰される。 臣下が職分をおのおの守り、発言が一致すれば、家臣たちどうしが徒党を組んで自分勝手なことをすることは無いのである。 == 儒家と法家の対比 == 法家の思想は「君主は、人民への愛情ではなく、法律によって、人民を統治するべきである」「法律を徹底するため、規則に反する者は、刑罰などで、きびしく罰するべきである」などのように厳格な法の適用によって国を治める思想である。『韓非子』はその理論を説いている。 仁義などの道徳の優位と教育の意義を説いた{{ruby|儒家|じゅか}}の思想とは、法家は対立している。そして、儒教的な考え方では、君子が道徳的になれば、民衆の多くも道徳的になり、政治は上手くゆくだろう、と考えるのが一般的である。 韓非は性悪説を説いた儒家の荀子に思想を学んだ。しかし、韓非は、素朴な儒教的な考え方を否定する。儒家の説く道徳などというのは、所詮は個人的な好き嫌いであり、社会のことを考えて作られた法律を超越するものではない、と。 == 韓非の思想 == 韓非の生きていた時代は、戦国時代であり、また政治が複雑化していって巨大化していたため、君主が領内を把握しづらくなってきていたので、このような統制を重んじる思想が、政治家からは求められていた。そのため、韓非以外にも法家に属する思想家・政治家もいた<ref>詳しくは[[高等学校倫理/諸子百家の思想]]、[[世界の大思想・哲学]]、[[中国史/戦国時代]]などを参照のこと。</ref>。 「人の心が善人か悪人かという難問は、政治の実務にとっては大したことはなく、法律を徹底させるということこそが、君主にとっては大切である。」というのが、韓非子の考えである。 韓非は、けっして善意にもとづく人情の価値をすべて否定しているのではなく、人情が法律をないがしろにすることを批判しているのである。個人の人情よりも、法律のほうが客観的であり、法律を重視すべき、としたのである。 また、民衆にとっての道徳と、君主にとっての道徳とは違うのである、と韓非は考えたのである。 たとえば、世間一般での、母親による子どもへの愛情について、韓非が言うには、(意訳すると)「実際に子どもを救うのは、医師や教師である。医師は病気やケガの治療によって人々を救う。」「教師は、教育によって、子どもが悪人になるのを防ぎ、結果的に人々を救うのである。」「医師も教師も、その人への愛情はあまり無いだろうが、しかしその人を確実に救っているのである。」「確かに肉親による愛情は深いことは事実だろうしが、それ自体は、直接は人々を救わないのである。」「だから、こどもは母親の命令に従うよりも、父親の命令によく従う。そして父親の命令に従うよりも、役人の命令によく従う。」と述べている。<ref>『要説 諸子百家・文章』p.51、p.55</ref> また、君主のありかたについて、韓非は「君主は、人を信じてはいけない。なぜなら部下にとっては、もし君主が死ねば、そのぶん自分たちの官位が上がる。また、同盟国など他国は、もし同盟国などを信用すれば、裏切って手薄な警備のところを侵略してくる。だから君主は、つねに裏切りには対策しておかねばならない。」みたいなことを述べている。<ref>同上p.52</ref> 法律を犯した者の事情も考えずに、法律を犯した者を処罰することは、人情味は無いなどとして民衆などには憎まれるが、しかし、そのように例外を認めずに処罰をすることによって、法律を侵す者が減り、結果的には社会を安定させることができるのである。これこそが君主にとっての道徳であると、韓非は考えたのである。 === 影響 === 戦国時代の秦王・政(のちに秦の始皇帝)は、この韓非の時代と同じ時代の人間である。『韓非子』<ref>厳密には「孤憤」「五蠹」の二篇。</ref>に秦王は感激し、始皇帝の政治にも韓非の思想が採用された。しかし、始皇帝の政治は、中国を統一するまでは、なんとか上手くいったが、彼の死後に秦帝国はすぐに滅亡する。統一から、わずか15年後のことだった。 == 脚注 == <references /> == 参考文献 == *『要説 諸子百家・文章』日栄社、昭和45年 [[カテゴリ:高等学校教育 国語 漢文]] j5yixucuit4da830vi7toxgfr8ds2od 大学数学公式集 0 32635 304773 294943 2026-10-16T13:43:29Z ~2026-55487-34 92805 いいね 304773 wikitext text/x-wiki {{see also|初等数学公式集}} ここでは大学教育レベルで、数学専攻以外の学部学科で用いる高等数学に関する公式を集約します。 == 微分 == == 積分 == * <math>\int \arcsin x\, dx = x\arcsin x + \sqrt{1-x^2} +C</math> *<math>\int \arccos x\,dx = x\arccos x - \sqrt{1-x^2} + C</math> *<math>\int \arctan x \, dx = x\arctan x - \frac{1}{2} \ln (1+x^2) +C</math> *<math>\int \frac{1}{x^2 + a^2} \, dx = \frac{1}{a} \arctan \frac{x}{a}+C\quad (a \ne 0)</math> * <math>\int \frac{1}{x^2 - a^2} \, dx = \frac{1}{2a} \ln \left|\frac{x-a}{x+a}\right|+C \quad (a \ne 0)</math> * <math>\int \frac {1}{\sqrt{a^2 - x^2}} \, dx = \arcsin\frac{x}{a}+C \quad (a > 0)</math> * <math>\int \sqrt{a^2 - x^2}\,dx = \frac{1}{2} \left(x \sqrt{a^2 -x^2}+a^2 \arcsin\frac{x}{a}\right)+C \quad (a > 0)</math> * <math>\int \frac{1}{\sqrt{x^2 + A}} \,dx = \ln \left|x + \sqrt {x^2 + A}\right|+C \quad (A \ne 0)</math> * <math>\int \sqrt{x^2+A}\,dx = \frac{1}{2}\left(x\sqrt{x^2+A}+A \ln\left|x+\sqrt{x^2+A}\right|\right)+C \quad(A \ne 0)</math> * <math>\int \frac{1}{\sin x} \, dx = \ln\left|\tan \frac{x}{2}\right| +C</math> * <math>\int \frac{1}{\cos x} \, dx = \frac{1}{2} \ln {\frac{1 + \sin x}{1 - \sin x}} +C</math> * <math>\int \frac{1}{\tan x} \, dx = \ln|\sin x| +C </math> == 微分方程式 == == 複素解析 == * <math> e^{i\theta} = \cos \theta + i \sin \theta </math> == 統計・確率 == {{DEFAULTSORT:たいかくすうかく}} [[Category:数学公式集]] jpab00c0af62kn7wl5h57p8hs5kmujj 高等学校日本史探究/新たな世紀の日本へⅡ 0 38286 304767 304186 2026-10-16T12:15:46Z Kwawe 68789 /* バブルの崩壊 */ 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出した。 304767 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。 [[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]] 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} {| style="border:2px solid #F3ADCB;width:100%" cellspacing="0" ! style="background:#F3ADCB" |'''アイヌ民族の戦後''' |- | style="padding:5px" | |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] fh3gwytu7w6u75mcrchoge843r7j7dr 304768 304767 2026-10-16T12:16:56Z Kwawe 68789 /* バブルの崩壊 */ 日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまった。 304768 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。 企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 [[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]] 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} {| style="border:2px solid #F3ADCB;width:100%" cellspacing="0" ! style="background:#F3ADCB" |'''アイヌ民族の戦後''' |- | style="padding:5px" | |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] hka96x8z9l9zfe3jw70zl9utt8803gv 304769 304768 2026-10-16T12:18:29Z Kwawe 68789 /* バブルの崩壊 */ 1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けた。 304769 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。 企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 [[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]] 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} {| style="border:2px solid #F3ADCB;width:100%" cellspacing="0" ! style="background:#F3ADCB" |'''アイヌ民族の戦後''' |- | style="padding:5px" | |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] twekn3zmv618iiw8tkwq6j72koy1vw1 304770 304769 2026-10-16T12:19:34Z Kwawe 68789 /* バブルの崩壊 */ 「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めた。 304770 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。 企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 [[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]] 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} {| style="border:2px solid #F3ADCB;width:100%" cellspacing="0" ! style="background:#F3ADCB" |'''アイヌ民族の戦後''' |- | style="padding:5px" | |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] ommi0joi1h05ojxvi9g8zxepv4svo3s 304771 304770 2026-10-16T12:21:22Z Kwawe 68789 /* バブルの崩壊 */ 304771 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} {| style="border:2px solid #F3ADCB;width:100%" cellspacing="0" ! style="background:#F3ADCB" |'''アイヌ民族の戦後''' |- | style="padding:5px" | |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] 3rrg4hmqwbxnzwpz345ao6vz28dy9td 304772 304771 2026-10-16T13:31:27Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 304772 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] oubjkhq60a4ztkptvrvaml9xfsc66ch 304774 304772 2026-10-16T14:08:58Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直した。 304774 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] jcnhytxxpdfbimatvy2pvj4a0ikno23 304775 304774 2026-10-16T14:09:28Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らした。 304775 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] rpiby72jet11772pt2j6d1jk9ftgotw 304776 304775 2026-10-16T21:15:00Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行った。 304776 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行いました。1995年1月17日、阪神・淡路地域でマグニチュード7.3の阪神・淡路大震災が起こりました。神戸市を中心に6400人以上が亡くなり、建造物・高速道路までも大きく壊れました。当地震で大都市は自然災害に弱く、都市政策・耐震化基準・防災体制の見直しをしました。また、国民は被災地に入って、避難民[被災者]の生活を支えたり、被災地の後片付けを手伝ったりしました。この活動からボランティア活動が全国に広がりました。 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] 5mesqfanagj7gi8iexwebr1u199rah5 304777 304776 2026-10-16T21:15:48Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 1995年3月20日、オウム真理教集団は東京都の地下鉄でサリンを撒いて、多数の死傷者を出した。 304777 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行いました。1995年1月17日、阪神・淡路地域でマグニチュード7.3の阪神・淡路大震災が起こりました。神戸市を中心に6400人以上が亡くなり、建造物・高速道路までも大きく壊れました。当地震で大都市は自然災害に弱く、都市政策・耐震化基準・防災体制の見直しをしました。また、国民は被災地に入って、避難民[被災者]の生活を支えたり、被災地の後片付けを手伝ったりしました。この活動からボランティア活動が全国に広がりました。 1995年3月20日、オウム真理教集団は東京都の地下鉄でサリンを撒いて、多数の死傷者を出しました(地下鉄サリン事件)。このように阪神・淡路大震災と地下鉄サリン事件・少年犯罪の殺人事件・児童虐待などが何度も報道機関で取り上げられ、旧価値観的な安全神話も崩れて国民の意識も変わりました。 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] g8klg60u1pwsp19wlj1kvqf9sfi40km 304778 304777 2026-10-16T21:39:38Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 写真を追加。 304778 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行いました。1995年1月17日、阪神・淡路地域でマグニチュード7.3の阪神・淡路大震災[兵庫県南部地震]が起こりました。神戸市を中心に6400人以上が亡くなり、建造物・高速道路までも大きく壊れました。当地震で大都市は自然災害に弱く、都市政策・耐震化基準・防災体制の見直しをしました。また、国民は被災地に入って、避難民[被災者]の生活を支えたり、被災地の後片付けを手伝ったりしました。この活動からボランティア活動が全国に広がりました。 1995年3月20日、オウム真理教集団は東京都の地下鉄でサリンを撒いて、多数の死傷者を出しました(地下鉄サリン事件)。このように阪神・淡路大震災と地下鉄サリン事件・少年犯罪の殺人事件・児童虐待などが何度も報道機関で取り上げられ、旧価値観的な安全神話も崩れて国民の意識も変わりました。<gallery mode="packed" widths="200" heights="200"> ファイル:Hanshin Expressway Nada b059.jpg|阪神淡路大震災被災後 ファイル:【地下鉄サリン事件】除染を行う自衛隊員と警察官.jpg|地下鉄サリン事件 </gallery>橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] 1mmqvakxv24tzb9o5qcfd60qufoe60x 304780 304778 2026-10-17T00:26:11Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 1996年1月、村山富市首相退陣後の内閣総理大臣指名選挙で橋本龍太郎が選ばれた。 304780 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行いました。1995年1月17日、阪神・淡路地域でマグニチュード7.3の阪神・淡路大震災[兵庫県南部地震]が起こりました。神戸市を中心に6400人以上が亡くなり、建造物・高速道路までも大きく壊れました。当地震で大都市は自然災害に弱く、都市政策・耐震化基準・防災体制の見直しをしました。また、国民は被災地に入って、避難民[被災者]の生活を支えたり、被災地の後片付けを手伝ったりしました。この活動からボランティア活動が全国に広がりました。 1995年3月20日、オウム真理教集団は東京都の地下鉄でサリンを撒いて、多数の死傷者を出しました(地下鉄サリン事件)。このように阪神・淡路大震災と地下鉄サリン事件・少年犯罪の殺人事件・児童虐待などが何度も報道機関で取り上げられ、旧価値観的な安全神話も崩れて国民の意識も変わりました。<gallery mode="packed" widths="200" heights="200"> ファイル:Hanshin Expressway Nada b059.jpg|阪神淡路大震災被災後 ファイル:【地下鉄サリン事件】除染を行う自衛隊員と警察官.jpg|地下鉄サリン事件 </gallery>1995年9月、自由民主党総裁選挙から橋本龍太郎が選ばれました。1996年1月、村山富市首相退陣後の内閣総理大臣指名選挙で橋本龍太郎が選ばれました。橋本内閣でも自民党・社会民主党・新党さきがけの3党が引き続き協力して、政策を進めました。なお日本社会党は自衛隊・日米安全保障条約の賛成側に回り、1996年に党名を社会民主党へ変えました。 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] pojnqborqxptw9cggvdej3i9dl8iyvz 304781 304780 2026-10-17T00:27:26Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 橋本龍太郎内閣厚生大臣の菅直人は川田龍平などの被害者に謝罪した。 304781 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行いました。1995年1月17日、阪神・淡路地域でマグニチュード7.3の阪神・淡路大震災[兵庫県南部地震]が起こりました。神戸市を中心に6400人以上が亡くなり、建造物・高速道路までも大きく壊れました。当地震で大都市は自然災害に弱く、都市政策・耐震化基準・防災体制の見直しをしました。また、国民は被災地に入って、避難民[被災者]の生活を支えたり、被災地の後片付けを手伝ったりしました。この活動からボランティア活動が全国に広がりました。 1995年3月20日、オウム真理教集団は東京都の地下鉄でサリンを撒いて、多数の死傷者を出しました(地下鉄サリン事件)。このように阪神・淡路大震災と地下鉄サリン事件・少年犯罪の殺人事件・児童虐待などが何度も報道機関で取り上げられ、旧価値観的な安全神話も崩れて国民の意識も変わりました。<gallery mode="packed" widths="200" heights="200"> ファイル:Hanshin Expressway Nada b059.jpg|阪神淡路大震災被災後 ファイル:【地下鉄サリン事件】除染を行う自衛隊員と警察官.jpg|地下鉄サリン事件 </gallery>1995年9月、自由民主党総裁選挙から橋本龍太郎が選ばれました。1996年1月、村山富市首相退陣後の内閣総理大臣指名選挙で橋本龍太郎が選ばれました。橋本内閣でも自民党・社会民主党・新党さきがけの3党が引き続き協力して、政策を進めました。なお日本社会党は自衛隊・日米安全保障条約の賛成側に回り、1996年に党名を社会民主党へ変えました。 薬害エイズ問題も大きく取り上げられました。橋本龍太郎内閣厚生大臣の菅直人は川田龍平などの被害者に謝罪しました。その後、国と製薬会社と被害者が話し合い、和解しました。 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] rntq34fynck358vhdm58sc5og8ffvwk 304782 304781 2026-10-17T00:28:27Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 304782 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行いました。1995年1月17日、阪神・淡路地域でマグニチュード7.3の阪神・淡路大震災[兵庫県南部地震]が起こりました。神戸市を中心に6400人以上が亡くなり、建造物・高速道路までも大きく壊れました。当地震で大都市は自然災害に弱く、都市政策・耐震化基準・防災体制の見直しをしました。また、国民は被災地に入って、避難民[被災者]の生活を支えたり、被災地の後片付けを手伝ったりしました。この活動からボランティア活動が全国に広がりました。 1995年3月20日、オウム真理教集団は東京都の地下鉄でサリンを撒いて、多数の死傷者を出しました(地下鉄サリン事件)。このように阪神・淡路大震災と地下鉄サリン事件・少年犯罪の殺人事件・児童虐待などが何度も報道機関で取り上げられ、旧価値観的な安全神話も崩れて国民の意識も変わりました。<gallery mode="packed" widths="200" heights="200"> ファイル:Hanshin Expressway Nada b059.jpg|阪神淡路大震災被災後 ファイル:【地下鉄サリン事件】除染を行う自衛隊員と警察官.jpg|地下鉄サリン事件 </gallery>1995年9月、自由民主党総裁選挙から橋本龍太郎が選ばれました。1996年1月、村山富市首相退陣後の内閣総理大臣指名選挙で橋本龍太郎が選ばれました。橋本内閣でも自民党・社会民主党・新党さきがけの3党が引き続き協力して、政策を進めました。なお日本社会党は自衛隊・日米安全保障条約の賛成側に回り、1996年に党名を社会民主党へ変えました。 薬害エイズ問題も大きく取り上げられました。橋本龍太郎内閣厚生大臣の菅直人は薬害エイズ被害者[川田龍平など]に謝罪しました。その後、国と製薬会社と被害者が話し合い、和解しました。 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] 126qmmbpc8dlddm296unk704boknsow 304785 304782 2026-10-17T06:59:42Z Kwawe 68789 /* 行政改革と日米安保の変化 */ 1996年、新しい選挙制度で初めて衆議院議員総選挙が行われ、自由民主党の議席を大きく増やしても、過半数を下回った。 304785 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>新たな世紀の日本へⅡ  引き続き「新たな世紀の日本へ」の内容を解説します。第2回目では、政界再編から小渕恵三内閣までの国内政治を見ていきます。 == 政界再編と55年体制の終結 == ※55年体制の崩壊で、国内政治はどのように変わりましたか。 {| style="border:2px solid #80A491;width:100%" cellspacing="0" ! style="background:#80A491" |村山談話 1995年8月15日「戦後五十周年の終戦記念日にあたって」を現代語に翻訳 |- | style="padding:5px" | |} == バブルの崩壊 == プラザ合意後、大量のお金が土地購入・株式購入のために使われ、土地の値段・株価[資産価格]が次第に上がりました(資産インフレ)。1989(平成元)年、日本銀行は銀行へお金をあまり貸さなくなり、政府も土地の値段を上げすぎないようにしました(金融引き締め政策)。1990年代に入ってから、土地の値段・株価は下がり始めました。日経平均株価は、1989年12月末に3万8915円まで上がりました。しかし、その後は株式売却が増えて株価もいきなり下がり、1992年8月に1万4309円まで下がりました。土地の値段も1991年頃から下がり始め、1992年以後は日本各地で下がりました。2000年代半ばになると、大阪の一部商業地は一番高い時期の値段から約10分の1まで下がりました。こうして土地や株式の大幅な値上がりは終わり、1980年代後半のバブル経済は終わりました。 ★日本の実質経済成長率の推移 [[ファイル:GDP_growth_rate_in_Japan.svg|代替文=日本の実質経済成長率の推移|フレームなし|924x924px]] 日本の景気は1991年から悪くなりました('''平成不況''')。実質経済成長率は1992年に1.3%、1993年に1%未満まで下がりました。1992年を3か月ずつに分けて見ると、4~6月は-3.3%となり、前の3か月より国内経済が小さくなりました。7~9月と10~12月もそれぞれ-0.1%となりました。第1次石油危機後に2期連続の経済縮小時期はあっても、3期連続の経済縮小は戦後初めてでした。僅かな景気回復時期も平成不況の途中にありました。しかしすぐに経済縮小となり、平成不況が長年続きました。 バブル経済当時の国民は金融機関からお金を借りて、株価と地価をより高い価格で買いました。金融機関は不動産会社にもお金を貸しました。バブル崩壊後、株価と地価が大きく下がりました。国民は株と土地を全て売っても借金を返せなくなりました。国民の借金も金融機関へ返ってこなくなりました(不良債権)。金融機関は株と土地を債権として持っており、不良債権から金融機関も大赤字になりました。 金融機関は不良債権処理にずっと追われて、さらに苦しくなりました。その結果、金融機関は不良債権の心配からお金を貸さなくなりました。企業は金融機関からお金を借りにくくなりました。国民も「この金融機関は大丈夫か」と不安を感じるようになり、金融機関はさらに苦しくなりました。その後、企業は新しい商品を作れなくなり、新しい工場を建てられなくなり、新しい機械も買えなくなりました。地価の下落・株価の下落・不良債権の増加・金融機関の経営悪化・金融機関の融資停止が全て重なって景気も次第に悪くなりました('''複合不況''')。 当時の政府と日本銀行はこれまでの不況と同じように、財政支出の拡大・低金利政策から数年で景気も回復するかもと思っていました。この誤対策は複合不況に一切効果ありません。住宅金融専門会社は1995年頃から相次いでつぶれました。1997年、北海道拓殖銀行と山一証券がつぶれました。1998年、日本債券信用銀行と日本長期信用銀行がつぶれました。このように大手金融機関がつぶれると、国民も他の金融機関も危ないのではないかと不安になりました。政府は金融システムまで止まらないように、倒産寸前の大手金融機関などに大量の公的資金を入れました。<gallery mode="nolines" widths="200" heights="200"> ファイル:The Hokkaido Takushoku Bank.JPG|旧北海道拓殖銀行本店 ファイル:Kayabacho Tower, at Shinkawa, Chuo, Tokyo (2019-01-02) 02.jpg|旧山一證券本社 ファイル:日債銀本店.jpg|旧日本債券信用銀行本店 ファイル:Shinsei Bank (head office 1).jpg|旧日本長期信用銀行本店 </gallery>1998年、小渕恵三が内閣総理大臣になりました。小渕恵三内閣も大型予算から景気を回復させしようとしました。小渕内閣が公共投資を増やして国民のお金を回そうとしても複合不況に一切効果ありません。こうして、公債発行残高は増えました。物価は1990年代後半からずっと下がり続けました(デフレスパイラル)。 [[ファイル:Unemployment Rate of Japan 1953-2009.jpg|サムネイル|395x395ピクセル|日本の失業率]] 企業は赤字なので、生き残るために経営の効率化[事業整理・人員削減・雇用調整・海外進出など]を進めました(リストラクチャリング)。中小企業の倒産も増えて、中高年労働者の解雇・中高年労働者の早期退職・新卒採用の削減から企業の人件費を大幅に減らしました。バブル景気の時期は労働者不足から「売り手市場」でも、バブル崩壊後から「買い手市場」へ変わりました。1990年代半ばから2000年代前半、企業は新卒採用を大幅に減らしました(就職氷河期)。1998年の完全失業率は4%を超え、2001年の完全失業率で5%になりました。 失業者が増えると労働者も「自分も仕事を失うかもしれない」と不安になり、個人消費を減らしました。消費者は同じような商品なら出来るだけ安い商品を選ぶようになり、ブランド品・高級品を買ってくれなくなりました。商品が売れなくなると、会社も少量生産・既存工場・既存機械だけで行うようになりました。その結果、会社の利益がさらに減って、人員削減・採用縮小もさらに進みました。株価と地価の下落から不良債権が増えて、金融機関の経営も苦しくなり、企業へお金を貸せなくなりました。 円高も国際分業も進みました。1994年、1ドルが100円を割り込みました。輸出主導・量産指向型産業[自動車・電子・家電・事務機器など]は海外で売れにくくなりました。また、バブル崩壊後の不景気から国内の購入者も減りました。生産費用を少しでも減らすため、労働者の給料が日本より低いアジア諸国[中国など]へ工場を移すようになりました[国内工場の閉鎖・国内工場の海外移転]。その結果、地元企業・周辺店舗の売り上げを減らし、失業者を増やしました(地域産業の空洞化)。 繊維産業の事業所数は減り続けました。2015年の繊維産業の事業所数は1991年と比べて約4分の1になりました。国内衣料品市場のうち海外衣料品購入割合は1991年で52%になり、2017年で97%まで上がりました。多数の多国籍企業が1990年代後半に日本企業を合併したり、買収したりしました。企業が日本型雇用を取り入れていても競争力強化・経営効率化から人員削減・能力給の導入を進めました。その結果、働き方の不安定さが広がりました。 日本は技術面でも負けています。1980年代、日本企業はエレクトロニクス[電子機器]・新素材・バイオテクノロジーなどの技術でアメリカに追いつこうとしていました。1990年代から情報通信技術の活用や生産性の伸びでアメリカ合衆国に負けました。商品は日本国内で売れにくくなり、業務内容も変わっていきました。そのため、日本企業は海外企業に負けないような対策を取りました。 バブル崩壊後、銀行制度・企業制度も変えられました。「日本版金融ビッグバン」を1996年に打ち出して、銀行・証券会社などにも規制を緩めて金融の自由化・国際化を進めました。1997年の独占禁止法改正から禁止の持株会社を再度認めました。企業は持株会社からグループ内の会社をまとめ直したり、経営の進め方を変えたりしやすくなり、その後の企業再編・金融再編にもつながりました。 以前の大規模小売店舗法は店舗面積500平方メートル以上の大規模小売店舗出店条件として出店規模・営業時間・営業日数などを定めていました。しかし、大規模小売店舗は中小小売業者の近くにも自由に出店しており、中小小売業者のお客様まで消えました。そのため、政府は大規模小売店舗の立地場所を1998年から制限しました(大規模小売店舗立地法)。中小小売業者から流れすぎないように守りながら、大規模小売店舗も中小小売業者も商売を続けられるようにしました。2000年、大規模小売店舗法を廃止しました。[[ファイル:Asian Financial Crisis EN-2009-05-05.png|サムネイル|273x273px|アジア通貨危機の影響国]]企業再編・合併は政府の規制緩和から広がり、海外企業と国内企業の協力・合併も増えました。その流れから六大企業集団もまとまりました。金融業界でも銀行などが倒産したり、別の銀行と合併したりしました。その結果、日本の金融業界は三井住友グループ[旧三井系と旧住友系]・三菱UFJ[旧三菱系と三和系]・みずほグループ[旧第一勧銀系と旧富士系]の三大金融グループへまとまりました。 国内長期不況で苦しむ中、アジア諸国の経済は大成長しました。しかし短期海外資金の依存・金融機関の過剰な借入れ・企業の過剰な借入れ・金融制度の弱さ・投機資金の流入などから海外投資家が危機感を示して一斉に海外資金を回収・売却・国外移動を行いました。1997年、タイの通貨バーツの価値が大きく下がりました。海外投資家は東アジア・東南アジアから次々と海外資金を回収・売却・国外移動を行いました(アジア通貨危機)。その結果、東アジア・東南アジア諸国の金融と経済は大きな爪痕を残しました。債務問題は韓国などで大きくなり、国際通貨基金(International Monetary Fund:IMF)の支援を受けました。アジア通貨危機は日本経済と日本の金融機関にも大きな爪痕を残して、不良債権問題をさらに悪化させました。 日本政府はアジア通貨危機の発生から地域的な金融協力制度[アジア通貨基金構想]を出しました。しかし、アメリカ合衆国の反対から日本政府は二国間金融支援と新宮沢構想などに切り替えて、東アジア諸国を金銭面で助けました。 バブル経済崩壊後の平成不況はずっと続きました。景気は2002年初期に少しだけ上向きました。しかし、政府が公共事業中心の従来型景気対策を抑えながら不良債権処理と規制改革を進めました。その結果、企業は引き続き大規模なリストラと雇用調整を行いました。当初、バブル崩壊後の長期停滞は「失われた10年」とよばれました。その後も日本経済の停滞が強く、「失われた20年」「失われた30年」とよばれました。 == 行政改革と日米安保の変化 == 1990年代後半、大規模災害の対策・重大事件への対策・行政改革・財政改革・金融改革・冷戦後の日米安全保障体制見直し・政党の組み直しを行いました。1995年1月17日、阪神・淡路地域でマグニチュード7.3の阪神・淡路大震災[兵庫県南部地震]が起こりました。神戸市を中心に6400人以上が亡くなり、建造物・高速道路までも大きく壊れました。当地震で大都市は自然災害に弱く、都市政策・耐震化基準・防災体制の見直しをしました。また、国民は被災地に入って、避難民[被災者]の生活を支えたり、被災地の後片付けを手伝ったりしました。この活動からボランティア活動が全国に広がりました。 1995年3月20日、オウム真理教集団は東京都の地下鉄でサリンを撒いて、多数の死傷者を出しました(地下鉄サリン事件)。このように阪神・淡路大震災と地下鉄サリン事件・少年犯罪の殺人事件・児童虐待などが何度も報道機関で取り上げられ、旧価値観的な安全神話も崩れて国民の意識も変わりました。<gallery mode="packed" widths="200" heights="200"> ファイル:Hanshin Expressway Nada b059.jpg|阪神淡路大震災被災後 ファイル:【地下鉄サリン事件】除染を行う自衛隊員と警察官.jpg|地下鉄サリン事件 </gallery>1995年9月、自由民主党総裁選挙から橋本龍太郎が選ばれました。1996年1月、村山富市首相退陣後の内閣総理大臣指名選挙で橋本龍太郎が選ばれました。橋本内閣でも自民党・社会民主党・新党さきがけの3党が引き続き協力して、政策を進めました。なお日本社会党は自衛隊・日米安全保障条約の賛成側に回り、1996年に党名を社会民主党へ変えました。 薬害エイズ問題も大きく取り上げられました。橋本龍太郎内閣厚生大臣の菅直人は薬害エイズ被害者[川田龍平など]に謝罪しました。その後、国と製薬会社と被害者が話し合い、和解しました。 1996年、新しい選挙制度で初めて衆議院議員総選挙が行われ、自由民主党の議席を大きく増やしても、過半数を下回りました。社会民主党と新党さきがけは第2次橋本内閣から国務大臣を出さなくなり、閣外協力に変わりました。その結果、自由民主党単独政権に戻りました。 橋本龍太郎内閣は冷戦後の国際変化・国内経済・政府問題を解決するため、行政・財政・金融の各分野を見直しました。行政改革は政府組織を減らしたり、類似の政府組織を1つにまとめたりして、首相などの政策案を出しやすくしました。1998年、中央省庁等改革基本法が導入されて中央省庁等改革関連法から行政改革の方針を決めました。 2001年1月、政府はこの行政改革の方針から中央省庁を1府22省庁から1府12省庁に減らしました。その結果、内閣総理大臣は各省庁へ指示を出して、政府全体の政策を進めやすくしました。2007年、防衛庁を防衛省に上げました。 ★省庁再編 {| class="wikitable" !再編前 !再編後 !再編前 !再編後 |- |内閣官房 |内閣官房 |大蔵省 |財務省 |- | rowspan="2" |総理府 金融再生委員会 経済企画庁 沖縄開発庁 | rowspan="2" |内閣府 |科学技術庁 文部省 |文部科学省 |- |厚生省 労働省 |厚生労働省 |- |国家公安委員会 |国家公安委員会 |農林水産省 |農林水産省 |- |防衛庁 |防衛庁(省) |通商産業省 |経済産業省 |- |総務庁 郵政省 自治省 |総務省 | rowspan="2" |北海道開発庁 国土庁 建設省 運輸省 | rowspan="2" |国土交通省 |- |法務省 |法務省 |- |外務省 |外務省 |環境庁 |環境省 |} == 資料出所 == * 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年 * 高埜利彦、高村直助ほか編著『日本史A 改訂版』株式会社山川出版社 2016年 * 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年 * 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年 * 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年 * 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年 * 河合敦著『世界一わかりやすい河合敦の日本史B[近・現代]の特別講座』株式会社KADOKAWA 2014年(絶版本) * 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年 * 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年 [[カテゴリ:高等学校日本史探究|あらたなせいきのにほんへ]] [[カテゴリ:20世紀]] r2x3b64dc45i1dbi4oxt6itqaj482kj コンピュータセキュリティ 0 48948 304766 304726 2026-10-16T12:11:42Z ~2026-54076-02 92740 /* メモリ安全性の高いソフトウェアへ */ 304766 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています: * [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR) === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] g2m53tqzp3h44kkfffenjnobojdjami 304786 304766 2026-10-17T08:11:42Z ~2026-54076-02 92740 /* 潜在的な脆弱性を減らす */ 304786 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接呼び出しがあると、そのアドレスから ASLR オフセットがバレてしまいます。また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] h01sojjqkz8z3oqywakvy449hnakfms 304787 304786 2026-10-17T08:59:49Z ~2026-54076-02 92740 /* 潜在的な脆弱性を減らす */ 304787 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。この Spectre を防ぐ方法としては投機的実行を阻害するための Retpoline が考案されましたが当然ながら速度の低下が著しく、LLVM では既知の仮想関数呼び出しを直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています。 なお特権境界をまたいだ Spectre は Intel の eIBRS などハードウェア側によって塞がれました。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] gc3jn9b0tfevtgtipg05felk09cq1rz 304788 304787 2026-10-17T09:06:32Z ~2026-54076-02 92740 /* アドレス空間配置のランダム化 */ 304788 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。この Spectre を防ぐ方法としては投機的実行を阻害するための Retpoline が考案されましたが当然ながら速度の低下が著しく、LLVM では既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。 なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] n52r422ha8xim2gi37xgq1j4zsgkz66 304789 304788 2026-10-17T09:32:14Z ~2026-54076-02 92740 /* アドレス空間配置のランダム化 */ 304789 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。この Spectre を防ぐ方法としては Spectre v1 対策として投機的実行を阻害するための命令(x86ではLFENCE}}{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>}}やアクセスできるアドレス範囲を狭めること{{efn|Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code>}}が、 Spectre v2 対策として retpoline が登場したものの、retpoline は速度の低下があり、LLVM では既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。 なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] rxx9c6fi03l7dgutkwawdepyxsjukni 304790 304789 2026-10-17T09:40:37Z ~2026-54076-02 92740 /* アドレス空間配置のランダム化 */ 304790 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。この Spectre には境界チェックを迂回する Spectre v1 と間接分岐の予測キャッシュを汚染する Spectre v2 が存在する。この Spectre v1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めること{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}が、 Spectre v2 対策として retpoline が登場したものの、retpoline は速度の低下があり、LLVM では既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。 なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] gssx84lvma2rzzrn3eqisnont84olaz 304791 304790 2026-10-17T09:55:59Z ~2026-54076-02 92740 /* 潜在的な脆弱性を減らす */ 304791 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。この Spectre には境界チェックを迂回する Spectre v1 と間接分岐の予測キャッシュを汚染する Spectre v2 が存在します。 この Spectre v1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre v2 を防ぐ方法としては retpoline が登場したものの、retpoline は速度の低下が起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する手法が模索されました。LLVM では既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。 なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] r85nhoz05ll5ch0snou75b77yqx8tis 304792 304791 2026-10-17T09:59:40Z ~2026-54076-02 92740 /* アドレス空間配置のランダム化 */ 304792 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。この Spectre には境界チェックを迂回する Spectre v1 と間接分岐の予測キャッシュを汚染する Spectre v2 が存在します。 この Spectre v1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre v2 を防ぐ方法としては retpoline が登場したものの、retpoline は速度の低下が起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。 なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] n71mn59jy9mesppzar9bq1e4ovgwbq3 304793 304792 2026-10-17T10:09:42Z ~2026-54076-02 92740 /* 潜在的な脆弱性を減らす */ 304793 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。この Spectre には境界チェックを迂回する Spectre v1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre v2 が存在します。 この Spectre v1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre v2 を防ぐ方法としてはリターン命令の予測を使う retpoline が登場したものの、retpoline は速度の低下が起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。 なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 3rdd4d0bm7enj8hhbxjnqn1uwtk3fpq 304794 304793 2026-10-17T10:18:02Z ~2026-54076-02 92740 /* アドレス空間配置のランダム化 */ 304794 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === アドレス空間配置のランダム化 === [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)はカーネル、ユーザーランドの両方で行われています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === 投機的実行の情報漏れ防止 === Spectre には境界チェックを迂回する Spectre V1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre V2 が存在します。 この Spectre V1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre V2 を防ぐ方法としては分岐先アドレスキャッシュの代わりにリターンアドレスのキャッシュ{{efn|リターンスタックバッファ (RSB) と呼ばれる。}}を使う retpoline が登場したものの、retpoline は速度の低下が起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。<!--TODO: Intel CETのSHSTKとretpolineの衝突--> なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 <!-- リターンアドレスのキャッシュもRetbleedによって云々。 --> === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] cr3y0zqxxrvbvj2wd1dumf94a22hegl 304795 304794 2026-10-17T10:21:19Z ~2026-54076-02 92740 /* 潜在的な脆弱性を減らす */ 304795 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に使うメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=No、1=Partial、2=Full kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR オフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === 投機的実行の情報漏れ防止 === Spectre には境界チェックを迂回する Spectre V1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre V2 が存在します。 この Spectre V1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre V2 を防ぐ方法としては分岐先アドレスキャッシュの代わりにリターンアドレスのキャッシュ{{efn|リターンスタックバッファ (RSB) と呼ばれる。}}を使う retpoline が登場したものの、retpoline は速度の低下が起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。<!--TODO: Intel CETのSHSTKとretpolineの衝突--> なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 <!-- リターンアドレスのキャッシュもRetbleedによって云々。 --> === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 2btcwfa4masv80g8rqogrz0iqu03agx 304796 304795 2026-10-17T10:33:23Z ~2026-54076-02 92740 /* 潜在的な脆弱性を減らす */ 304796 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (Spectre) は攻撃に繋がります。Spectre には境界チェックを迂回する Spectre V1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre V2 が存在します。<!--TODO: Spectre v3/v4--> Spectre V1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre V2 では攻撃を防ぎながらも速度を落とさない方法として脆弱な分岐先アドレスキャッシュに依存する間接分岐の代わりにリターンアドレスのキャッシュ{{efn|リターンスタックバッファ (RSB) と呼ばれる。}}に依存するリターン命令を使う retpoline が登場しました。しかしながらこの retpoline でも速度の低下は起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。<!--TODO: Intel CETのSHSTKとretpolineの衝突--> なお低特権コードから高特権コードへの特権境界をまたいだ Spectre は Intel の IBRS / eIBRS などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>。 一方、リターン命令の投機的実行も Retbleed という脆弱性が見つかっています。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 6ytmwhtbpi6tj08a9hgbivpg0kwxlx1 304797 304796 2026-10-17T10:51:19Z ~2026-54076-02 92740 /* 潜在的な脆弱性を減らす */ 304797 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (Spectre) は攻撃に繋がります。Spectre には境界チェックを迂回する Spectre V1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre V2 が存在します。<!--TODO: Spectre v3/v4--> Spectre V1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre V2 では攻撃を防ぎながらも速度を落とさない方法として脆弱な分岐先アドレスキャッシュに依存する間接分岐の代わりにリターンアドレスのキャッシュ{{efn|リターンスタックバッファ (RSB) と呼ばれる。}}に依存するリターン命令を使う retpoline が登場しました。しかしながらこの retpoline でも速度の低下は起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。<!--TODO: Intel CETのSHSTKとretpolineの衝突--> 一方、リターン命令の投機的実行も Retbleed や AMD CPU における SRSO{{efn|Speculative Return Stack Overflow。}}のような脆弱性が見つかっています。 なお低特権コードから高特権コードへの特権境界をまたいだ Spectre および Retbleed は Intel の間接分岐制限付き投機 (IBRS){{efn|Indirect Branch Restricted Speculation。}}およびそれを高速化した eIBRS(拡張IBRS)などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>が、特権境界をまたがないものは今も可能となっています。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] caljwpqb5t92qtdkqqd0236w284kahh 304798 304797 2026-10-17T10:56:48Z ~2026-54076-02 92740 /* 投機的実行の情報漏れ防止 */ 304798 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (Spectre) は攻撃に繋がります。Spectre には境界チェックを迂回する Spectre V1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre V2 が存在します。<!--TODO: Spectre v3/v4、Zenbleed--> Spectre V1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre V2 では攻撃を防ぎながらも速度を落とさない方法として脆弱な分岐先アドレスキャッシュに依存する間接分岐の代わりにリターンアドレスのキャッシュ{{efn|リターンスタックバッファ (RSB) と呼ばれる。}}に依存するリターン命令を使う retpoline が登場しました。しかしながらこの retpoline でも速度の低下は起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。<!--TODO: Intel CETのSHSTKとretpolineの衝突--> 一方、リターン命令の投機的実行も Retbleed や AMD CPU における「投機的リターンスタックオーバーフロー」 (SRSO){{efn|Speculative Return Stack Overflow。}}のような脆弱性が見つかっています。 なお低権限コードから高権限コードへの権限境界をまたいだ Spectre および Retbleed は Intel の「間接分岐制限付き投機」(IBRS){{efn|Indirect Branch Restricted Speculation。}}およびそれを高速化した eIBRS(拡張IBRS)などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>が、権限境界をまたがないものは今も可能となっています。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] is4ekan8uv0vtayn7ujpiuekl9mtu6t 304799 304798 2026-10-17T11:50:22Z ~2026-54076-02 92740 /* 安全にパスワードを使う */ 304799 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> === 解析耐性のあるハッシュアルゴリズムを使う === パスワードでは計算負荷の低いSHA-256やSHA-512、メモリ負荷の低いbcryptを使うのは辞めましょう。GPU や ASIC で直ぐに解かれてしまいます。 より強いハッシュアルゴリズムとしては yescrypt や Argon2id が存在します。現代の Linux ではアカウントのパスワードに標準で yescrypt が使われています。 Linuxのアカウントで使われる標準アルゴリズムは以下で確認可能です: <syntaxhighlight lang="shell-session"> $ grep -n 'pam_unix.so' /etc/pam.d/common-password 26:password [success=2 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt </syntaxhighlight> Linuxの現在のアカウントがどのアルゴリズムを使用しているかは以下で確認可能です: <syntaxhighlight lang="shell-session"> $ sudo cat /etc/shadow | grep $USER # $(1|5|6|b)$=弱い、$y$=強い user:$y$j9T$ST7oYwlQjFy7/8vnL/Ugt0$po4vW4qgGu8lpUNRtH0B3hDHGZACzcRhzIKhqlx.2Z5:20743:0:99999:7::: </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (Spectre) は攻撃に繋がります。Spectre には境界チェックを迂回する Spectre V1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre V2 が存在します。<!--TODO: Spectre v3/v4、Zenbleed--> Spectre V1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre V2 では攻撃を防ぎながらも速度を落とさない方法として脆弱な分岐先アドレスキャッシュに依存する間接分岐の代わりにリターンアドレスのキャッシュ{{efn|リターンスタックバッファ (RSB) と呼ばれる。}}に依存するリターン命令を使う retpoline が登場しました。しかしながらこの retpoline でも速度の低下は起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。<!--TODO: Intel CETのSHSTKとretpolineの衝突--> 一方、リターン命令の投機的実行も Retbleed や AMD CPU における「投機的リターンスタックオーバーフロー」 (SRSO){{efn|Speculative Return Stack Overflow。}}のような脆弱性が見つかっています。 なお低権限コードから高権限コードへの権限境界をまたいだ Spectre および Retbleed は Intel の「間接分岐制限付き投機」(IBRS){{efn|Indirect Branch Restricted Speculation。}}およびそれを高速化した eIBRS(拡張IBRS)などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>が、権限境界をまたがないものは今も可能となっています。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] ojbf0tict58utheswtfcznd1cc8j8hx 304800 304799 2026-10-17T11:52:12Z ~2026-54076-02 92740 /* 解析耐性のあるハッシュアルゴリズムを使う */ 304800 wikitext text/x-wiki '''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。 == コンピュータセキュリティの基本 == コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。 具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。 新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。 この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。 == 安全にパスワードを使う == <!-- === パスワードの複雑性をチェックする === --> === 流出パスワードと被ってないかをチェックする === あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。 使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。 <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力) $ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1) Password: $ # 変換後のハッシュを表示 $ echo $sha1 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 $ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数) $ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-) FE5CCB19BA61C4C0873D391E987982FBBD3:1579235 </syntaxhighlight> === 解析耐性のあるハッシュアルゴリズムを使う === パスワードでは計算負荷の低いSHA-256やSHA-512、メモリ負荷の低いbcryptを使うのは辞めましょう。GPU や ASIC で高速に解かれてしまいます。 より強いハッシュアルゴリズムとしては yescrypt や Argon2id が存在します。現代の Linux ではアカウントのパスワードに標準で yescrypt が使われています。 Linuxのアカウントで使われる標準アルゴリズムは以下で確認可能です: <syntaxhighlight lang="shell-session"> $ grep -n 'pam_unix.so' /etc/pam.d/common-password 26:password [success=2 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt </syntaxhighlight> Linuxの現在のアカウントがどのアルゴリズムを使用しているかは以下で確認可能です: <syntaxhighlight lang="shell-session"> $ sudo cat /etc/shadow | grep $USER # $(1|5|6|b)$=弱い、$y$=強い user:$y$j9T$ST7oYwlQjFy7/8vnL/Ugt0$po4vW4qgGu8lpUNRtH0B3hDHGZACzcRhzIKhqlx.2Z5:20743:0:99999:7::: </syntaxhighlight> <!-- === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。 : また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。 ; macOS / iOS : 「ソフトウェアアップデート」 ; Ubuntu / Debian : [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。 : Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。 : また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。 ; RedHat / Fedora : <code>yum update</code>コマンド ; Android : 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」 また個々のハードウェアのファームウェアアップデートは以下で行います: ; Linux : Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。 : NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。 一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。 <!-- また開発環境では以下も存在します: ; Python : <code>pip -U install</code> --> ==== ルーター ==== ルーターでは以下の設定を有効のままにしておきましょう: ; AirStationシリーズ(Buffalo 製ルーター) : 「ファームウェア自動更新機能」 ; Atermシリーズ(NEC 製ルーター) : 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」 ==== テレビ ==== テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。 === 高速に再起動する === パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。 ; 更新で影響を受けるデーモンのみ再起動する :* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。 :* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。 ; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合) : <code>sudo systemctl soft-reboot</code> ; 高速にカーネルを更新する(ファームウェアの更新がない場合) : <code>sudo systemctl kexec</code> また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。 === 代替ソフトウェアを探す === 更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。 ==== 開発終了したソフトウェアから現役のソフトウェアへ ==== 古いソフトウェアには例えば以下があります: * オフィススイート(代替候補: LibreOffice) ** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年) * 画像ビューア ** [[:w:Susie|Susie]] (〜2013年) * メディアプレイヤー ** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。 * メディアフィルター(代替候補: LAV Filters) ** [[:w:ffdshow|ffdshow]](〜2014年) ** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年) * メディアセンター(代替候補: Kodi) ** [[:w:en:Boxee|Boxee]](〜2011年) ** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身 * 圧縮ソフトウェア ** [[:w:+Lhaca|+Lhaca]](〜2007年) ** [[:w:Lhaplus|Lhaplus]](〜2017年) またハードウェアに由来する古いソフトウェアには例えば以下があります: * [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]]) ** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony) ** [[:w:SonicStage|SonicStage]](〜2009年、Sony) ** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony) * DTCP-IP関連 ** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref> ** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref> なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox--> ==== 古いバージョンのライブラリを避ける ==== 多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。--> * 画像ライブラリ ** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性) ** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性) ** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性) ** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性) ** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性) * 動画ライブラリ ** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性) * 圧縮ライブラリ ** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性) ** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性) ** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性) これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。 また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています: * UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref> Webフレームワークでは開発中止となった以下のフレームワークが問題となっています: * [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]]) ** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語 * [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]]) ** [[:w:Seasar|Seasar]](〜2016年) - Java言語 * [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]]) ** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript === 古いハードウェアに対処する === サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 現在のLinuxカーネルが ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> しかしながら間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]]の応用として、投機的探査によるコード位置情報の取得 (BlindSide) も登場しています。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (Spectre) は攻撃に繋がります。Spectre には境界チェックを迂回する Spectre V1 と間接分岐の分岐先アドレスのキャッシュ{{efn|分岐先バッファ (Branch Target Buffer、BTB)や分岐先アドレスキャッシュ (Branch Target Address Cache、BTAC) と呼ばれる。}}を汚染する Spectre V2 が存在します。<!--TODO: Spectre v3/v4、Zenbleed--> Spectre V1 を防ぐ方法としては投機的実行を阻害するための命令(x86ではLFENCE)の挿入{{efn|Linuxカーネルでの投機的実行の防止は<code>barrier_nospec()</code>。}}やアクセスできるアドレス範囲を狭めることが行われています{{efn|GCCでの投機的実行での範囲外アクセス防止は<code>__builtin_speculation_safe_value(...)</code>、Linuxカーネルでの投機的実行での範囲外アクセス防止は<code>array_index_nospec(...)</code><ref>[https://lwn.net/Articles/759423/ Spectre V1 defense in GCC] LWN 2018年7月10日</ref>。}}。 また Spectre V2 では攻撃を防ぎながらも速度を落とさない方法として脆弱な分岐先アドレスキャッシュに依存する間接分岐の代わりにリターンアドレスのキャッシュ{{efn|リターンスタックバッファ (RSB) と呼ばれる。}}に依存するリターン命令を使う retpoline が登場しました。しかしながらこの retpoline でも速度の低下は起こるため、既知の間接呼び出しを条件分岐 + 直接呼び出しに変換して高速化する手法が模索されました。LLVM では retpoline を有効にする <code>-mretpoline</code>フラグの処理内に既知の仮想関数呼び出しを[[:w:二分木|二分木]]の直接分岐に置き換える「分岐ファネル」(Branch funnel) が導入されています<ref>[https://reviews.llvm.org/D42453 Use branch funnels for virtual calls when retpoline mitigation is enabled.] LLVM project</ref>。また Linux カーネルでも既知の間接呼び出しを条件分岐 + 直接呼び出しに変換する INDIRECT_CALL_* マクロが搭載されています<ref>[https://lwn.net/Articles/774743/ Relief for retpoline pain] LWN 2018年12月14日</ref>。<!--TODO: Intel CETのSHSTKとretpolineの衝突--> 一方、リターン命令の投機的実行も Retbleed や AMD CPU における「投機的リターンスタックオーバーフロー」 (SRSO){{efn|Speculative Return Stack Overflow。}}のような脆弱性が見つかっています。 なお低権限コードから高権限コードへの権限境界をまたいだ Spectre および Retbleed は Intel の「間接分岐制限付き投機」(IBRS){{efn|Indirect Branch Restricted Speculation。}}およびそれを高速化した eIBRS(拡張IBRS)などハードウェア側によって塞がれました<ref>[https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/hardware-behavior-related-to-speculative-execution.html Hardware Features and Behavior Related to Speculative Execution] Intel 2026年10月14日</ref>が、権限境界をまたがないものは今も可能となっています。 === メモリにおける書き込みと実行の排他化 (W^X) === メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。 現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -o nx nx nx [...] </syntaxhighlight> 現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y </syntaxhighlight> しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。 Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ--> また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。 === 制御フローの操作を防ぐ (CET) === 現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。 制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます: * Intel Core (Tiger Lake) 第11世代以降 * AMD Zen 3 以降(シャドウスタックのみ) 現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)' shstk ibt shstk ibt [...] </syntaxhighlight> またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。 現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No CONFIG_CC_HAS_IBT=y # CONFIG_X86_KERNEL_IBT is not set CONFIG_X86_USER_SHADOW_STACK=y CONFIG_X86_DISABLED_FEATURE_IBT=y CONFIG_ARCH_HAS_USER_SHADOW_STACK=y </syntaxhighlight> 現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} + /usr/lib/lv2/carla.lv2/carla.so /usr/lib/7zip/7z /usr/lib/7zip/7zCon.sfx /usr/lib/7zip/7zr /usr/lib/7zip/7z.so /usr/lib/7zip/7za /usr/lib/klibc/bin/ipconfig /usr/lib/klibc/bin/umount /usr/lib/klibc/bin/halt /usr/lib/klibc/bin/resume /usr/lib/klibc/bin/dd /usr/lib/klibc/bin/pivot_root /usr/lib/klibc/bin/chroot /usr/lib/klibc/bin/false /usr/lib/klibc/bin/gzip /usr/lib/klibc/bin/ls /usr/lib/klibc/bin/nfsmount /usr/lib/klibc/bin/kinit /usr/lib/klibc/bin/sh /usr/lib/klibc/bin/dmesg /usr/lib/klibc/bin/uname /usr/lib/klibc/bin/minips /usr/lib/klibc/bin/fstype /usr/lib/klibc/bin/mknod /usr/lib/unrar /usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so /usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so [...] </syntaxhighlight> なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。 C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。 === メモリ安全性の高いソフトウェアへ === 既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています: {| class="wikitable" |+ コマンドのRust版 |- ! コマンドの概要 !! 従来版 !! Rust版 |- | Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils''' |- | ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils''' |- | ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils''' |- | ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed''' |- | AWKスクリプト || GNU AWK || '''uutils AWK''' |- | 文字列検索 || GNU Grep || '''uutils Grep''' |- | tarアーカイブ || GNU Tar || '''uutils tar''' |- | アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils''' |- | アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl''' |- | procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps''' |- | ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname''' |- | Linuxユーティリティ || util-linux || '''uutils util-linux''' |- | 権限昇格 || sudo || '''sudo-rs''' |- | 暗号・署名システム || GnuPG || '''Sequoia PGP''' |- | 時刻同期 || ntpd || '''ntpd-rs''' |- | セキュアシェル (SSH) || OpenSSH || '''russh''' |} これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。 またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています: * 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。 ** libpng → pngクレート - PNG画像向け。 ** libgif → gifクレート - GIF画像向け。 ** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。 ** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。 ** libtiff → tiffクレート - Tiff画像向け ** libwebp → image-webpクレート - WebP画像向け。 ** libraw → libopenraw - RAW画像向け。 ** librsvg - SVG画像向け。C言語からRustに書き直しされました。 * 圧縮ライブラリ ** zlib / zlib-ng → zlib-rs - Deflate圧縮向け ** libbzip2 → bzip2-rs - BZ2圧縮向け * 暗号化ライブラリ ** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]] * Unicode処理ライブラリ ** ICU4C → ICU4X * テキスト整形ライブラリ ** HarfBuzz → HarfRust * ブラウザエンジン ** Blink/Gecko → Servo <!-- === 整合性チェック === PatchGuard / HyperGuard --> == 不審な改変が行われていないかを調べる == {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* |- | [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1 |} {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル |- ! 規格/アプリケーション !! ユーザー !! システム |- | POSIX標準 || ~/.profile || /etc/profile |- | XDG Base Directory<wbr>標準 || ~/.local/bin/* || |- | FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab |- | LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/* |- | Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/* |- | Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout |- | Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout) |- | Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/* |- | Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/* |- | Wayland || || /usr/share/wayland-sessions/* |- | Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}} |- | Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: * Windows: <code>sfc /scannow</code> * Debian/Ububntu(Debパッケージ): <code>debsums -s</code> * RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code> ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法--> 自動的にシステムの検証を行うシステムも存在します: * Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref> <!-- またUbuntuのSnapパッケージでもdm-verityの導入が進められています。 また特定言語のパッケージの検証は以下で可能です: * PIP (Python): なし --> === システム領域に不審なファイルが追加されていないかを調べる === システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します: * Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド) 上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。 === ユーザー領域に不審なファイルが追加されていないかを調べる === ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く--> 共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります: {| class="wikitable" |+ 代表的なユーザースクリプトや拡張機能のディレクトリパス |- ! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス |- | Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/ |- | GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/ |- | Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender&#39;s Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/ |- | Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/ |- | LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/ |- | Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/ |} === 改変・追加されたファイルが危険かを調べる === 実行ファイルやスクリプトはLinuxでは以下で検出できます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)' /etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable /etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable /usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped </syntaxhighlight> またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます: <syntaxhighlight lang="shell-session"> # cat filelist.txt | xargs clamscan Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs Compiling: 1s, ETA: 0s [========================>] 41/41 tasks /etc/apt/apt.conf.d/00trustcdrom: OK /etc/apt/auth.conf.d/90ubuntu-advantage: OK /etc/apt/keyrings/google.asc: OK [...] ----------- SCAN SUMMARY ----------- Known viruses: 3628164 Engine version: 1.5.4 Scanned directories: 125 Scanned files: 1919 Infected files: 0 Total errors: 10 Data scanned: 247.72 MiB Data read: 281.17 MiB (ratio 0.88:1) Time: 17.939 sec (0 m 17 s) Start Date: 2026:10:11 05:41:30 End Date: 2026:10:11 05:41:48 </syntaxhighlight> === 設定データベースを検証する === 設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。 Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。 {| class="wikitable" |+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}} |- | [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath |- | [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>* |- | [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit |- | [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ |- | [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}} |- | [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}} |} Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。 {| class="wikitable" |+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定 |- ! 規格/アプリケーション !! ユーザー |- | GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command |- | Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}} |- | MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}} |- | mate-applets || /org/mate/panel/objects/object-*/prefs/command |- | mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command |} なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。 == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。 === ファームウェア改ざんを防ぐ === ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情--> なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。 また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。 Intel MEのバージョンはLinuxでは以下のような感じに調べることができます: <syntaxhighlight lang="shell-session"> $ cat /sys/class/mei/mei0/fw_ver 0:16.1.32.2473 0:16.1.32.2473 0:16.1.27.2181 </syntaxhighlight> === ブートローダー改ざんを防ぐ === ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。 UEFI Secure Boot が有効かどうかは以下で確認できます: * Windows PowerShell: <code>Confirm-SecureBootUEFI</code> * Linux: <code>mokutil --sb-state</code> UEFI db と UEFI dbx の内容は以下で確認できます: * Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code> * Linux: ** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code> ** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code> ブートローダーの署名情報は以下で確認できます: * Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}} * Linux: <code>sbverify --list</code> 例えば Windows PowerShell では以下のような感じです: <syntaxhighlight lang="powershell"> PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D } Thumbprint Subject ---------- ------- FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US </syntaxhighlight> また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります: <syntaxhighlight lang="shell-session"> $ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け) 2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed $ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用) b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI $ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI Signature verification OK </syntaxhighlight> なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。 <!--TODO: TPM (Trusted Platform Module) チップ --> === カーネル本体の改ざんを防ぐ === カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。 なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます: <syntaxhighlight lang="shell-session"> $ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する signature 1 image signature issuers: - /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority image signature certificates: - subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1) issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority $ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する Signature verification OK </syntaxhighlight> === カーネルモジュールの改ざんを防ぐ === カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。 カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます: * Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code> カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます: * Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode * Linux: <code>cat /sys/module/module/parameters/sig_enforce</code> また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です: <syntaxhighlight lang="shell-session"> $ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No CONFIG_MODULE_SIG=y $ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No N $ sudo dmesg | grep 'module verification' [ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel $ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint [...] $ sudo sh ./kernel-chktaint Kernel is "tainted" for the following reasons: * externally-built ('out-of-tree') module was loaded (#12) * unsigned module was loaded (#13) Raw taint value as int/string: 12288/'G OE ' Tainted modules: * nvidia (OE) * nvidia_drm (OE) * nvidia_modeset (OE) * nvidia_uvm (OE) For a more detailed explanation of the various taint flags see Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html </syntaxhighlight> また Linux では以下のような感じで個々のモジュールの署名が確認できます: <syntaxhighlight lang="shell-session"> $ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst license: GPL description: x86 generic MSR driver author: H. Peter Anvin <hpa@zytor.com> srcversion: 639B995855A3528050FD532 depends: intree: Y name: msr retpoline: Y vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F sig_hashalgo: sha512 signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C: 4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17: 0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB: [...] </syntaxhighlight> === システムファイル改ざんを防ぐ === システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。 1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。 そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。 一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。 === カーネルメモリ改ざんを防ぐ === カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。 また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。 <!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor--> <!-- === アプリケーション改ざんを防ぐ === SELinux / AppArmor --> == 攻撃用AIを対策する == 攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。 === コンテキスト爆弾を設置する === 攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。 このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。 コンテキスト爆弾のテキスト例は以下のリポジトリに存在します: * https://github.com/tracebit-com/context-bombs === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 0tlfsbx9tdeu63od1l39qdqee90xkzj 自然地理学 0 48962 304779 2026-10-16T22:17:11Z モチモチのキナコモチ 92391 ページの作成:「== 自然地理学 == 自然地理学とは、地球上の自然環境や自然現象の成り立ちや分布、そしてそれらと人間生活との関係を科学的に研究する学問である。 ・[[地形学]] *[[火山]] *[[海岸]] *[[河川]] *[[山地]] *[[谷]] *[[平野]] ・[[気候学]] ・[[水文学]] ・[[土壌地理学]] ・[[第四紀学]] ・[[災害地理学]] == 人文地理学 == 人文地理学とは、地球上における人間…」 304779 wikitext text/x-wiki == 自然地理学 == 自然地理学とは、地球上の自然環境や自然現象の成り立ちや分布、そしてそれらと人間生活との関係を科学的に研究する学問である。 ・[[地形学]] *[[火山]] *[[海岸]] *[[河川]] *[[山地]] *[[谷]] *[[平野]] ・[[気候学]] ・[[水文学]] ・[[土壌地理学]] ・[[第四紀学]] ・[[災害地理学]] == 人文地理学 == 人文地理学とは、地球上における人間活動の空間的構造や地域的特徴を解明する学問である。 ・[[都市地理学]] ・[[農村地理学]] ・[[経済地理学]] ・[[文化地理学]] ・[[社会地理学]] ・[[政治地理学]] == 補足 == 足りないものや説明等を付け足したい時はどうか付け足してください(荒らしは厳禁)。 ミスがあった場合、修正してくださると嬉しいです。 l2zwsq3dmnsdxdtr8bq4dbrw62ghc8h