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.48.0-wmf.1 first-letter メディア 特別 トーク 利用者 利用者・トーク Wikibooks Wikibooks・トーク ファイル ファイル・トーク MediaWiki MediaWiki・トーク テンプレート テンプレート・トーク ヘルプ ヘルプ・トーク カテゴリ カテゴリ・トーク Transwiki Transwiki‐ノート TimedText TimedText talk モジュール モジュール・トーク Event Event talk 中学数学3年 相似な図形 0 3103 305202 223604 2026-10-30T10:50:27Z PYRROLINE 90898 /* 三角形の相似条件 */ 305202 wikitext text/x-wiki {{pathnav|中学校の学習|中学校数学|中学数学3年|pagename=相似な図形}} この章では、より進んだ平面図形の性質を扱います。特に、ある図形が相似の関係を持つときに、図形の間に成り立つ性質について述べます。 ==相似== [[Image:Japan_sea_map.png|250px|right]][[Image:Japan satellite.jpg|250px|right]] === 相似な図形 === たとえば、地図を見てみましょう。地図は、実際の地形と全く同じ形になるように書かれています。しかし、地図は持ち歩いたり、調査などに使うため、本物よりも小さく書かれています。例えば縮尺が25000分の1となっているなら、本物の25000分の1の大きさで、全く同じ形に書いてあるということになります。 また、本などを縮小コピーしたり、拡大コピーしてみましょう。やはり、原稿と同じように印刷されますが、大きさは変わっているはずです。 では、もっと簡単な図形である三角形はどうでしょうか。全く同じ形でも大きさが違う三角形では、どういう共通な性質を持っているでしょうか。 [[Image:SimilarTriangles.jpg]] この2つの三角形は、全く同じ形をしていますが、大きさが違います。この2つの三角形を比べると、次のことが言えます。 * ∠A = ∠D、 ∠B = ∠E、 ∠C = ∠F * AB:DE = BC:EF = CA:FD ある2つの図形について、それらの図形の大きさだけが異なっていて、形は全く同じであるとき、この2つの図形は'''相似'''(そうじ)である、といいます。 {| style="border:2px solid springgreen;width:80%" cellspacing=0 |style="background:springgreen"|'''相似な図形の性質''' |- |style="padding:5px"| 一般に、相似な図形では、次のことが成り立つ。 # 対応する線分の長さの比はすべて等しい。 # 対応する角の大きさはそれぞれ等しい。 |} また、円は半径に関わらず常に同じ形をしているので、すべて相似な図形であるといえます。 また、2年生で学習した合同な図形は、必ず相似の関係も満たしています。ただし、相似な図形は常に合同であるということは成り立ちません。 ;問題 次の図形が互いに相似であるかどうか述べよ。 #半径1cmの円と半径2cmの円 #辺の長さが2cm,3cm,4cmの三角形と4cm,6cm,8cmの三角形 #辺の長さが1cm,2cm,2cmの三角形と2cm,5cm,5cmの三角形 #辺の長さが3cm,4cm,5cmの三角形と別の3cm,4cm,5cmの三角形 ;解答 #円は半径に関わらず常に同じ形をしているので相似。 #それぞれの辺の比が1:2の関係を満たしているので、それぞれの図形は相似。 #それぞれの辺の比が等しくないので、これらの図形は相似ではない。 #2つの三角形は3辺が同じ長さを持っていることから互いに合同となっている。 合同な図形は相似な図形でもあるので、この2つの図形は相似となる。 === 相似比 === 相似な図形で、対応する線分の長さの比を'''相似比'''(そうじひ)といいます。 === 三角形の相似条件 === 2年生では三角形が合同になる条件を考えました。ここでは三角形が相似になる条件を考えてみましょう。 三角形の相似条件は、次のようになる。 {| style="border:2px solid springgreen;width:80%" cellspacing=0 |style="background:springgreen"|'''三角形の相似条件''' |- |style="padding:5px"| 次の3つのうち、1つでも成り立てば相似である。 # 3組の辺の比がすべて等しい。 # 2組の辺の比とその間の角がそれぞれ等しい。 # 2組の角がそれぞれ等しい。 |} ※昔は、1を三辺比相等(SSS)、2を二辺夾角相等(SAS)、3を二角相等(AA)とも習ったそう。尚、これをテストに書くと減点対象になる場合もあるので、覚えなくてよい。 === 相似の位置 === [[ファイル:相似の位置-2.jpg|frame|right|相似の位置 ]] 右の図は、<math>OD=2OA,OE=2OB,OF=2OC</math>となっている。 この図から次のことがわかる。 :<math>OD:OA=OE:OB=OF:OC=2:1</math> このように、2つの図形の対応する点を通る図形がすべて一点Oを通り、点Oからその点までの距離の比がすべて等しいとき、この2つの図形は'''相似の位置'''にあるといい、点Oを '''相似の中心'''という。 この時、点Oから対応する点までの距離の比が2つの図形の相似比になる。 右の図の場合、相似比は1:2である。 == 平行線と相似 == === 平行線と比 === 次に、上で得た相似の考えを用いて、一定の比を持つ平行線と交わる線分の間の 比について述べる。このとき、次の結果を得る。 :ある一定の比を持つ間隔で並んでいる平行線を考えるとき、それらに任意の角度で交わる直線が作る線分は上で得た平行線間の間隔の比と等しい長さの比を持つ。 *導出 平行線をそれぞれl,m,nと呼ぶ。 このとき、ある角度でl,m,nに交わる直線を取り、それらがl,m,nと交わる点を A,B,Cと呼ぶ。 *図 ここで、Cからlに向かって下ろした垂線とlの交点をC'と呼び、 ここで、Bからlに向かって下ろした垂線とlの交点をB'と呼ぶ。 このとき、三角形ABB'とACC'は、互いに相似であることを示す。 実際、2つの三角形は直角三角形なので、どちらも90°の角を持っている。 更に、 :<math> \angle BAB'= \angle CAC' </math> は同じ角であるので同じ大きさである。よって、2つの角の大きさが等しいので、 上の2つの三角形は相似である。このことから、 :<math> BB' :CC' = AB : AC </math> が成り立つがこれは求めたかったことに等しい。 ===三角形と比=== <math>\triangle ABC</math>の辺AB上に点Dをとり、<math>DE\ //\ BC</math>となるように辺AC上に点Eをとる。 <math>\triangle ABC</math>と<math>\triangle ADE</math>において、 共通な角だから、<math>\angle BAC = \angle DAE</math> <math>DE\ //\ BC</math>から、<math>\angle ABC = \angle ADE</math> 2組の角がそれぞれ等しいから、<math>\triangle ABC</math>と<math>\triangle ADE</math>は相似である。 対応する辺の比が等しいから、<math>AD:AB = AE:AC = DE:BC</math> 上記に加えてさらに、<math>DF\ //\ AC</math>となるように辺BC上に点Fをとる。 <math>\triangle ADE</math>と<math>\triangle DBF</math>において、 <math>DE\ //\ BC</math>から、<math>\angle ADE = \angle DBF</math> <math>DF\ //\ AC</math>から、<math>\angle DAE = \angle BDF</math> 2組の角がそれぞれ等しいから、<math>\triangle ADE</math>と<math>\triangle DBF</math>は相似である。 対応する辺の比が等しいから、<math>AD:DB = AE:DF</math> また、四角形DFCEは2組の対辺がそれぞれ平行であるから平行四辺形である。 よって、<math>DF=EC</math> <math>AD:DB = AE:DF</math>と<math>DF = EC</math>から、<math>AD:DB = AE:EC</math> 今までのことをまとめると次のようになる。 {| style="border:2px solid springgreen;width:80%" cellspacing=0 |style="background:springgreen"|'''三角形と比(1)''' |- |style="padding:5px"| <math>\triangle ABC</math>の辺AB、AC上にそれぞれ点D、Eをとるとき、次のようなことが成り立つ。 # <math>DE\ //\ BC</math> ならば <math>AD:AB = AE:AC = DE:BC</math> # <math>DE\ //\ BC</math> ならば <math>AD:DB = AE:EC</math> |} この定理「三角形と比(1)」は逆も成り立つ。 1.の逆は「<math>\triangle ABC</math>の辺AB、AC上にそれぞれ点D、Eをとるとき、<math>AD:AB = AE:AC</math> ならば <math>DE\ //\ BC</math>」である。これを証明しよう。 <math>\triangle ADE</math>と<math>\triangle ABC</math>において、 仮定から、<math>AD:AB = AE:AC</math> 共通な角だから、<math>\angle BAC = \angle DAE</math> 2組の辺の比とその間の角が等しいから、<math>\triangle ADE</math>と<math>\triangle ABC</math>は相似である。 対応する角は等しいから、<math>\angle ADE = \angle ABC</math> 同位角が等しいから、<math>DE\ //\ BC</math> 一方、2.の逆は「<math>\triangle ABC</math>の辺AB、AC上にそれぞれ点D、Eをとるとき、<math>AD:DB = AE:EC</math> ならば <math>DE\ //\ BC</math>」である。これの証明は以下のようにできる。 <math>\triangle ADE</math>と<math>\triangle ABC</math>において、<math>AD:DB = AE:EC = a:b</math>とする。 <math>AD:AB = AD:(AD+DB) = a:(a+b)</math> <math>AE:AC = AE:(AE+EC) = a:(a+b)</math> よって<math>AD:AB = AE:AC</math> 共通な角だから、<math>\angle BAC = \angle DAE</math> 2組の辺の比とその間の角が等しいから、<math>\triangle ADE</math>と<math>\triangle ABC</math>は相似である。 対応する角は等しいから、<math>\angle ADE = \angle ABC</math> 同位角が等しいから、<math>DE\ //\ BC</math> 今までのことをまとめると次のようになる。 {| style="border:2px solid springgreen;width:80%" cellspacing=0 |style="background:springgreen"|'''三角形と比(2)''' |- |style="padding:5px"| <math>\triangle ABC</math>の辺AB、AC上にそれぞれ点D、Eをとるとき、次のようなことが成り立つ。 # <math>AD:AB = AE:AC</math> ならば <math>DE\ //\ BC</math> # <math>AD:DB = AE:EC</math> ならば <math>DE\ //\ BC</math> |} ===中点連結定理=== 定理「三角形と比(2)」によると、「<math>\triangle ABC</math>の辺AB、AC上にそれぞれ点D、Eをとるとき、<math>AD:DB = AE:EC</math> ならば <math>DE\ //\ BC</math>」であった。 ここで、点D、Eをそれぞれ辺AB、ACの中点とすると、 :<math> AD:DB = 1:1 </math> だから、<math>DE\ //\ BC</math>がいえる。 また、<math>\triangle ADE</math>と<math>\triangle ABC</math>は相似であり、相似比は<math>1:2</math>となる。 <math>DE:BC = 1:2</math>であるから、<math>2DE=BC</math> よって :<math> DE = \frac{1}{2} BC </math> 今までのことをまとめると次のようになる。 {| style="border:2px solid springgreen;width:80%" cellspacing=0 |style="background:springgreen"|'''中点連結定理''' |- |style="padding:5px"| <math>\triangle ABC</math>の辺AB、AC上にそれぞれ中点D、Eをとるとき、次のようなことが成り立つ。 :<math>DE\ //\ BC</math> , <math>DE = \frac{1}{2} BC</math> |} このような定理を中点連結定理(ちゅうてん れんけつていり)という。 ===相似の応用例=== == 相似な図形の面積比と体積比 == 面積の比のことを面積比、体積の比のことを体積比(たいせきひ)という。 ===相似な平面図形の面積比=== <math>\triangle A'B'C'</math>と<math>\triangle ABC</math>が相似であり、相似比が<math>k:1</math>のとき、<math>\triangle A'B'C'</math>の面積S'と<math>\triangle ABC</math>の面積Sの比を考える。 <math>BC=a</math>、BCに対する高さをhとすれば、<math>B'C'=ka</math>、B'C'に対する高さはkhとなるから :<math> S = \frac{1}{2} ah </math> :<math> S' = \frac{1}{2} \times ka \times kh = k^2 \times \frac{1}{2} ah = k^2 S </math> したがって :<math> S' : S = k^2 S : S = k^2 : 1 </math> 相似な三角形の面積比は、相似比の2乗に等しい。 円Oと円O'が相似であり、相似比が<math>m:n</math>のとき、円Oの面積Sと円O'の面積S'の比を考える。 円Oの半径をmk、円O'の半径をnkとすると :<math> S = \pi \times (mk)^2 = m^2 \times k^2 \pi </math> :<math> S' = \pi \times (nk)^2 = n^2 \times k^2 \pi </math> したがって :<math> S : S' = (m^2 \times k^2 \pi) : (n^2 \times k^2 \pi) = m^2 : n^2 </math> 今までのことをまとめると、次のようになる。 {| style="border:2px solid springgreen;width:80%" cellspacing=0 |style="background:springgreen"|'''相似な平面図形の面積比''' |- |style="padding:5px"| 相似な平面図形の面積比は、相似比の2乗に等しい。 相似比が<math>m:n</math>ならば、面積比は<math>m^2 : n^2</math>である。 |} === 角の二等分線に関する定理 === ※中高一貫校のみで扱う内容ですが、検定教科書でもわずかに触れられています。 [[Category:中学校数学|3ねんせい すけい すけいのせいしつ]] [[カテゴリ:図形]] fs6z0m2vs93mhje4yaq75b0ios37l8d トーク:京大対策 1 8670 305170 194843 2026-10-29T19:06:18Z ~2026-57700-00 92903 /* 個人所有時計の全面禁止について */ 新しい節 305170 wikitext text/x-wiki 参考図書の欄が削除されたのはなぜでしょうか。 <small>''([[User:218.224.97.93]]によるコメント、2008年7月28日 (月) 15:24 (UTC)に[[User:Ninomy|Ninomy]]が追加)''</small> 私も参考図書の欄があってもいいような気がしますが…。--[[特別:Contributions/125.194.86.113|125.194.86.113]] 2008年7月28日 (月) 13:07 (UTC)  : コメントありがとうございます。私は削除の編集を行ったユーザーではありませんが、コメントをさせていただきます。まず、ウィクショナリーは宣伝の場ではないですが、特定の本を「推薦図書」「参考図書」とすることは宣伝と取られる可能性があります。このユーザーはそう判断して削除したのかもしれません。また、このような「推薦図書」を示さなくとも、ウィクショナリー内でその大学の対策をできるような本を執筆することだってできます。そう考えれば、特に参考図書を示さなくてもいいのかもしれません。ただし、受験参考書の中には良書として長年使われているものもあり、それを紹介するのは悪いことではないとも思います。しかし、何を良書とするかには意見が分かれるところもあり、絶対の基準もない以上、私は載せるべきではないかなという風に考えますが、最終的な判断はここで議論して結論していただければよいと思います。--[[利用者:Ninomy|Ninomy]]<small>-[[利用者‐会話:Ninomy|chat]]</small> 2008年7月28日 (月) 15:24 (UTC) 京大対策の序文に関して、「~大学と共に~である、」等という表現が、「大学間の比較は不要」として何度か削除されているようですが、(確かに編集合戦になりがちな箇所ではありますが。)早稲田大学や慶應義塾大学の序文においては前文のような表現が許されているのは何故なのでしょうか。どなたかご教授願います。--[[特別:Contributions/125.194.86.113|125.194.86.113]] 2008年8月5日 (火) 09:07 (UTC) 確かに早稲田・慶應やその他の大学のページでは「~大学と共に~である、」といった表現が使われていますが、そもそもこれらの表現をwikibooksに載せるべきではないと思います。そうであってもどうにもこうにも他と比べたがる人間もいるもので削除されること無く掲載され続けていたり削除→追加→削除…が繰り返されたりしているのが現状だと思います。どの大学までが難関か、どの大学とどの大学が同レベルかといったことは主観的なものであり、一般的に日本で「東大京大」「旧帝大」「早慶」「MARCH」「関関同立」……というグループ表現や難易度レベルのグループが知られているとしても、中にはそれらに不賛成であり不満を抱く人もいるわけです。結果、おっしゃっている通り編集合戦が起こります。それを回避するには元から「~大学と共に~である、」という表現を用いないのがベストだと思います。(少し前の話ですが「日本の大学受験ガイド」のページでも大学序列をめぐって争いが起きました)。このような表現を載せている他大学の対策ページではそんなに編集合戦が起こっていないものもあるじゃないか、という意見もあるかもしれませんが、だからと言って本項でもそのような表現を載せてもいい、ということにはならないと思います。先ほども言ったとおり大学間の難易度は非常に争いを招きやすく、「日本の大学受験ガイド」でも大戦争が起こりました。京大対策のページでは、他大学のページでも難易度比較が載っているから…という安易な理由で載せるのではなく、現状では些細な因子でも将来は争いのもとになるかもしれないので、もともと載せないようにする、という方針が最良だと思いますがいかがでしょうか。大学間の比較はおいといて、京都大学が日本の大学の中で最高レベルであるのは間違いないのですから、現在のように他大学と比較することなく「国内最難関大学として知られている」という表現に留めておくので十分ではないでしょうか。--[[特別:Contributions/210.131.4.176|210.131.4.176]] 2008年9月5日 (金) 05:53(UTC) お返事のほう、読ませていただきました。私も「国内最難関大学(のひとつ)として知られている」という表現で特段問題はないと思います。仰る通り、主観の入り易い大学比較は荒らしを生む火種となり易いようですし、それによってこのページに対する信頼が揺らぐようであれば非常に残念なことだと思います。今回はご教授いただき、有難うございました。 --[[特別:Contributions/125.194.86.113|125.194.86.113]] 2008年9月5日 (金) 07:04 (UTC) == 京大の青本25年シリーズ == 京大の青本の25年シリーズが発売されているので、対策の欄に赤本の同様のシリーズと併記した方が良いと思うのですが、いかがでしょうか? == 全体的な問題点の指摘 == 再度差し戻しをされたようですので、少し問題提起を。確かに先日の差し戻しはやりすぎたかなという気もしましたが、やはり現状としては先日の差し戻し概要で述べたように、本記事およびその子記事(特に理科)は「情緒的、冗長、強迫的な記述であり、かつ真偽不明の噂話まで含み有害」です。以下、具体的に指摘いたします。 *出典の問題 主語が「某大手予備校講師」など誰が言ったのかを検証しがたい記述が多数見られます。ウィキペディアなら容赦なく要出典などのタグが張られまくる内容ですね。確かに、予備校講師の授業中の話などに有益な情報がある場合もありますし、速報的な内容は文章化されにくい場合もあること、それゆえに出典表記しにくいものがあることは認めます。しかし、まずは客観的に裏打ちできるテキストや参考書などを出典にした方がはるかに受験生に役立つと思います。 例えば、本記事の「アドミッションポリシー」。これ、いったい何が根拠なんですか。京大の公式サイト? それとも受験案内? もし京大が公式で述べている乃至それを基にしているのであれば、ちゃんと出典を示すべきです。それとも予備校の分析ですか? それならどの予備校かくらいは書くべきでしょう。 また、[[京大対策/理科]]や[[京大対策/数学]]の難易度表は何が根拠ですか。赤本? 予備校の分析? それとも、記述者の分析? 前2者なら剽窃ですし、後者なら主観的記述です。 せめて、逐一出典を書くことができなくとも参考文献一覧くらいはあった方が受験生のためにもなるでしょう。「受験生の役に立てば多少出典がいい加減でもいいんだ」というのは、研究者・学者養成を謳い文句にする京大に対して大変に失礼でしょうし、京大受験生の姿勢としてもあるまじきものです。 *大げさすぎる記述・情緒的な表現 流石に削除されたようですが、京大理科の「2020年度京大入試嘔吐失神事件」はいろいろな意味で「本当かよ」と思う内容でした。それにとどまらず、とかく大言壮語・誇張したのではないかと言いたくなるような記述が目立ちます。 例えば、本ページ・英語の「この問題(注:表面的な日英間の相互変換)はかねてより、京大が大変な危惧をもって慎重に扱うテーマであり、この思想が往年より初志貫徹といった具合にはっきり大学入試に反映されているのは、日本の大学入試においては京大が唯一といってもいい。」という記述。本当なんですか? まぁ、私が不勉強なだけだと言えばそれまでなのですが。 他にも「日本の大学入試の歴史の中において前例の無い事態」などのように傍から見れば大げさな記述な何の脚注もなく記載されています。 それと関連して、本ページと理科のところにある「予備校化学業界の金字塔」。これ、このままだと記載されている講師の個人宣伝になってしまうのではありませんか。 また、生物に顕著ですが、読み物乃至は個人のブログのような記述が目につきます。例えば、「古典遺伝学」のところ。20行近く本筋と関係のないことが書かれていると思うのですが。 「京大に入ろうと思うのならば受験内容に留まらず、このくらいは知っておくべきなのダ」と言いたいのかもしれません。それならば、子ページに「京大受験生が読むべき文献」といったページを作り、文献の紹介をした方がすっきりすると思うのですが。(それこそ、京大を志す人が文献のあんちょこのごとき記述で満足したら恥ずかしいと思うよ) *編集 まず、<br>(全角文字にしています)の多用は勧められません。必要がない限り、改行は一行空けですることが推奨されます。また、青字・赤字などの色付きフォントも勧められなかったような気がしますね。 あと、私の方で直しましたが「入試後の過ごし方」は最後の方でしょう。その他、章立てや記述順は見直した方がいいんじゃないかなと思うところが少々。 以上、問題提起させていただきました。編集者の皆様のご意見などがいただけましたら幸いです。私は返信が遅いので、気長にお待ちいただけましたら幸いです。 --[[特別:投稿記録/2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92|2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92]] 2021年9月5日 (日) 11:33 (UTC) 少なくともI氏含めた予備校講師関連の話題、難易度表、参考図書、理科における入試と直接的には関連しない分野の話題、写真、その他客観性を保てない分野は一旦削除すべきと考えます。またこのページはあくまで京大について記述する場所であるため、「日本の大学受験ガイド」のページにある通り他大学についての情報も除去することが望ましいと考えます。 さらにこのページの投稿記録を遡るとほとんど同一IPによる編集であることが分かるため、主観の入る部分が大きいと考えられます。 以上を踏まえ、少なくとも上記の一については削除を実行すべきと考えます。皆様のご意見をお願いします。--[[特別:投稿記録/240B:13:200:7800:C9B6:5686:B8AE:AC12|240B:13:200:7800:C9B6:5686:B8AE:AC12]] 2021年9月5日 (日) 12:22 (UTC) :早速のご意見ありがとうございます。あえて書きませんでしたが、受験とは関係のない写真もいろいろ載っていて、余計な情報量が多く何のためのページなのか首をかしげたくなります。正直、今のページは受験生向けというよりも、京大在学生・卒業生および「受験マニア」向けの読み物という観があります。おっしゃられた部分の削除が現状妥当だと思います。--[[特別:投稿記録/2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92|2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92]] 2021年9月5日 (日) 13:40 (UTC) 拝読させていただきました。 上記において指摘に上がっているように、情報の大元をたどることが難しい、あるいは巧妙に伏せられている? と思しき曖昧な記述が目立つ点について概ね同意します。適宜修正が加えられていくべきとこちらも判断しているので、私以外も含めて京大対策ページの開設者、執筆担当者本人もまじえてここで建設的に議論を進められればと思います。 現状の京大対策wikibooksは有益な情報と客寄せを目的としたと思えるようなセンセーショナルな記述が玉石混淆の状況であり、後者の記述が前者の有益な耳寄り情報の価値をくすませてしまうことは好ましくないと感じています。乱暴に一括削除するよりも、丹念にたどれる真偽についての選り分け、可能なものについては出典タグを添えるなど長丁場の添削作業を有志で連携して行うのが賢明かと思います。 ここでの議論が開設者と執筆担当者の目に触れれば、この作業が多少楽にはなるかと思いますが。ひとまず何人集まるか次第でしょうか。 英語、数学、国語、理科のすべてについて丹念に情報の真偽を検証していくことには数カ月スパンはかかりそうなので。 ・英語 予備校の解答速報舞台裏の記述は誇張が過ぎるため明らかに不要と判断。そもそも事実確認が不可能であり、内輪ネタの記載は他の情報の信憑性を汚染するだけ。英語は予備校や塾の講習会と大学の講義雑談の出典記載は困難だが、京大参考書の講義CDや書籍なども英語については潤沢なので、出典となる書籍の探り当ては他の教科と比べたら容易であろう。京大担当の有名講師、竹岡、櫻井あたりの話が元になっていると思われる。確認と洗い出しが必要。英作文については京大公式の注意文とwikiの執筆者の記述が混在しているためわかりやすい区別が必要。竹岡が「赤本の英作文解答例を講習会で酷評」のくだりは有名事実であるが、この書き方が赤本のネガティブキャンペーンに当たらないかは慎重になるべき。他の利用者の意見も確認すべきか。 ・数学 数学の採点現場の記述は名誉教授の森重文の書籍、当時の京都大学における講義中の談話が由来かと思われる。後者はレジュメや口伝が情報ソースなので開示は困難ですが、前者であれば出典明記が部分的に可能でしょう。また各大手予備校(河合塾、駿台、代ゼミ、東進)の京大講習会配布のプリントや小冊子、講師の雑談が元になっているものも散見されるので、この部分をどうするかが課題の一つ。 採点の厳しさは毎年異なっており、本番の採点で完答主義がどこまで徹底されているかは予備校講師の間で藻意見が対立しているはずなので、そうした立場が分かれていることは明記しておく方が無難。 少なくとも近年は2010年前後のような徹底した完答主義ではないはず。ここも要検証と議論が必要。 ・国語 国語は高得点域の不在は主観的には嘘ではないと思われるが、公式データが無いため断定口調の表記は疑問。京大採点官について「思春期の読書云々」のくだりは不安を煽るリスクのある記述だと感じる。京大の講義での雑談と記載されているため出典の明記は困難? 大学入試分析会の配布資料に根拠となる記述が見つかればPDFのリンクを貼って対処すべき。「6割以上の高得点が至難」という記述についてはややオーバーと思ったが、例年の開示と京大模試の偏差値表から判断すれば妥当と結論。京大入試詳解現代文の執筆者の松本孝子の書籍と教員向け配布資料にも類似の記載を確認。得点分布域表の項目における国語の得点戦略の記述は主観的記述と思われるので蛇足と判断。表だけ残すのが妥当? 意見求む。 ・物理 物理は「嘔吐事件の記述」は不要と思われるが、Youtubeチャンネルにて京大受験生が事実と発信している動画があり、夏期の予備校講習会でも雑談として言及があったようで、真っ赤な嘘とも言い難い。 ただ仮に事実を含むとしても、過剰な恐怖心を煽る書き方に問題があるため削除は妥当と判断した。 ・化学 化学は「石川正明」を過剰に持ち上げる記述が気になる。執筆者が石川正明のファンであろうと思われるが、結果的に予備校講師のPRをwikiに掲載しているようなもので好ましいとは思えず。 頻出項目の記述、理論、無機、有機の内容は膨大であるため整理が必要なのは同意。ただし高得点を望む層にとってかなり有益な内容を含んでいる。ただ模試の内容と本試の内容をもっと区別して記述を整理した方がわかりやすい。模試の出題内容や出典年度について確認できる範囲で照合した限りは嘘の記述は見当たらなかったため、完全削除はさすがにやりすぎと判断。ただし記載の学習習熟度の要求水準が京大受験生の一般的水準よりも高く、医学科受験生をターゲットにしていると思える記述も混在しているため、目標得点や志望学部に応じた到達点の区別をもっと明確にすべきと思われる。 1.特定の個人のPR色の強い記述を削除、2.誇張表現箇所を部分的に修正の2点にひとまずしぼって整理していくのがよさそう。他にもなにかあれば意見求む。 ・生物 生物は分野の背景説明が豊富だが、有害とは感じないため削除の必要性は感じない。むしろ個人的には教科書に記載の無いバックグラウンドの紹介は有益にも思えるので、どう扱うかは他の編集者との議論や閲覧者の意見聴取が必要。削除された版では情報らしい情報がまともに残っていなかったため、どういったスタンスで統一するかをまずはっきりさせた方がよさそう。「客観性」にこだわりすぎると毒にも薬にもならない記述しか残らない。突き詰めれば受験指導は「主観的体験」の積み重ねで、どれだけそれを無限に厚くしても客観性に生まれ変わったりはしない。主観色イコール不要記述は潔癖症が過ぎると思われる。 ・模試のくだり 京大模試の日程の項目の削除は不要と判断したが、京大模試の作問の舞台裏の記述は、どこの予備校の舞台裏かさえ不明なので削除が妥当。(伏せられていたの葉執筆者の身バレ防止目的か?) 作問担当のくだりは明らかに不要な記述のため削除は妥当と判断した。ただし模試と本試の採点の相違は周知の事実であり、また勘違いしたままの受験生への注意喚起にもなるため、出典と思われる駿台発行の「京大入試突破レクチャー」を明記するなどして残すことも検討すべきか。意見求む。 ・得点戦略のくだり 「京大国語の伝説」のくだりは明らかに根拠不明のため掲載取り下げの継続が妥当。「京大数学の配点の重要性」の項目は、受験生一人一人の得点戦略という個人の領域への押しつけがましさを感じさせたため、同様に掲載取り下げの継続が妥当。 ・学部説明のくだり 「各学部紹介の項目」は完全なPR文であり、対策という主旨と乖離しているため削除は妥当と判断した。また最低点推移の表も予備校サイトや赤本、青本に掲載が見られるため。わざわざ容量をとってまでの記載は不要と判断した。削除は妥当と判断したが、異論がある可能性もあるので他の意見待ち。 ・その他 指摘に上がっているように、1.br改行の多用、2.太字の乱用、3.色文字の使用は明らかに見直されるベき。太字の乱用のせいでかえって読みづらい。また色文字はそもそも不要と個人的には思う。 長くなったので、一旦ここで返信と他の利用者、執筆者、開設者等の意見待ち。  --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年9月5日 (日) 14:24 (UTC) 京大志望の高校生ですが、横から失礼します。 編集の事情は疎いので、編集の是非の打ち合わせに加わる意思はありません。 自分は関西の高校に通ってますが、僕も僕の同級生も少なくない人が定期的にここの記事を参考にしてるので、予告なくいきなり削除するのはやめてほしいです。特に数学の類題問題のとことか、化学の解説はけっこうな人が頻繁に使ってます。 あとさ化学のどのへんが有害で強迫めいた内容なのか僕にはよくわからないのですが。 とりあえず削除した直後の記事がスカスカすぎ。あんなもん誰が参考にするの。特に英語、数学、生物とか中身なんもなくなってんじゃん。消すことへのこだわりこじらせすぎるほうが有害じゃないですか。純度100パー確度の情報にこだわった結果人が見なくなったら本末転倒。 あとツイッターやツイキャス配信で削除に怒ってるひと他にもいるからこれ思ったの自分だけじゃないはず。 とりあえず数学の類題紹介の削除だけはホント勘弁して。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月6日 (月) 13:09 (UTC) :こんばんはー。私は基本的にはここで、大学入試対策関係のページは一切見ないし、あまり興味もないんですよ。今回のコメントも、きちんと読んだのは受験生ですさんのコメントだけです。しかしこの京大対策のページ、以前ちらっと見たんですが、恐ろしく馬鹿馬鹿しい内容にしか見えませんでしたね。もちろん勉強としてはそれなりに内容があるんのは認めますが、しかし書いてる奴は恐ろしく性根腐った糞野郎だな、なんて思った。だから、最近のここを書きなおそうという試みは、少なくとも私にとってはいい流れに見える。あと内容について消されると困るとのことですが、ここは過去の編集は全て記録に残ってるんです。ですからもちろん定常になければ見るのは手間がかかりますが、完全に無くなってしまうわけではない。あんたも自分が賢くてすごい人間だと思い込んでるのなら、それくらい手間をかけてみたっていいんじゃあないの?見る人がどうのって言うけど、基本的にここは、市販の書籍とは違う世界でね。売れて金が手に入ればえらいわけではない。と、いうか、以前の狂った内容のほうがいいと思う人間しか京大に行かないんなら、もうこの国は終わりだろう。もちろん世の中、声のでかい奴ほど下らん奴でね。ツイッターでのでかい声なんか何の意味もないよ。そしてもちろん、お前らと違ったまともな人間も、東大京大には進学するだろう。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月6日 (月) 19:35 (UTC) どうも。 Honoooさんの返信を読ませていただきました。 昨日も書きましたが、記事をどういう方向で手直ししてくかみたいな話は自分は記事を編集する側の人間じゃないので参加しません。 だから記事がどうあるべきかのような美学みたいなのは語れません。 ですが、いきなり高校生相手に「自分が賢くてすごい人間と思い込んでる」とか「お前らとはちがったまともな人間も、東大京大に進学するだろう」とか何でいきなり口汚く罵られないといけないんでしょうか? そもそも東大はぜんぜん話と関係ないですよね。「この国は終わりだ」とかも大袈裟すぎじゃ。 編集の世界がすべてみたいに一方的に語られて、部外者が軽々しく口出ししてくるなみたいな威圧的な態度に感じました。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月7日 (火) 01:38 (UTC) :そう?とりあえず今はやらなきゃいけないことがあるから,もうちょっと後で詳しいことは書くけど,あんたの最初の文章の態度は問題ない?本当に礼儀正しい丁寧な文章かね?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 01:58 (UTC) Honoooさんへ たしかに僕自身も最初の書き込みで、削除側のスタンスに対して否定的な発言をしています。 感情がこもった言い方そのものに不快を覚えたのなら謝ります。 ただ僕がつっこみを入れたのはあくまで記事の処遇の流れに対してで、特定の個人を悪く言ってはいないです。 いきなり僕個人や自分のクラスメイトを指して、「お前」呼ばわりをしたり、なんの脈絡もないのに「東大京大に進学するやつは」みたいな強引な話の持っていき方は、今読み返しても執拗で怖いです。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月7日 (火) 02:15 (UTC) :まあいいからちょっと待てって。今日の夜まで待っててくれ^^--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 02:36 (UTC) :では,夜も更けてきましたので…。とは言っても,最初の文章で言いたいことは全部書いてしまいましたし,特に今回,何らかの反論をする必要も全く感じませんね。そこで一点だけ書いておきます。受験生さんは,私の文章が執拗で怖いと書いていますが,貴方みたいな人やそのクラスメイト達,学校の勉強はできるけどそれ以外は何もない,善意もない,勉強を超えた物事に関する理解もない,そういう人たちが集まって集団化して,自己満足と自惚れに浸って恍惚としながら顔を見合わせて笑っている,そういう場に出くわしたあなた方以外の人間の感じる恐怖は,貴方の感じた恐怖の100倍はあるよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 10:24 (UTC) Honoooさんへ まず前提の確認ですが、自分は記事一つに意見を挟んだだけです。 僕やクラスメイトの私生活やパーソナルな一面さえ何も開示していないのに、「学校の勉強はできるけどそれ以外は何もない,善意もない,勉強を超えた物事に関する理解もない,そういう人たちが集まって集団化して,自己満足と自惚れに浸って恍惚としながら顔を見合わせて笑っている」 こんなふうに一方的に決めつけて、しつこく喰ってかかってきていることが、双方向性の理解を放棄しているようにしか映らないです。 「善意がない、集団化して自己満足とうぬぼれにひたって笑ってる」と言われても困りますし、僕の返信のどの部分の内容から、話がここまで飛躍するのか、一向にピンと来ません。 ここまで目のかたきにされるとは思いませんでした。 「勉強ができるだけで社会のことを分かっていない」というのは、自分はまだ未成年の学生ですしまともな社会経験も無いのでもっともだとは思います。しかし記事への感想一つから、僕や同級生の人間性や僕の所属する高校やコミュニティがなぜこき下ろされているのでしょうか。 あの投稿から、人間性は読み解けるわけはないでしょう。対面でも相手の本質を理解することは人間にとって難しいはずなのに。人間性を見抜いてるんだと、あなたがひとりよがりになって錯覚しているだけだと思います。 それに言葉の節々から攻撃性をどうしても感じてしまいますし、意見がわずかでも食い違う相手を一方的に敵視して、説き伏せるというよりもねじ伏せようとしているように思います。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月7日 (火) 11:00 (UTC) :うーん,で,この先どうする?240Bさんには無視されちゃったようだし^^;;。私的には京大にもあなたにも大した興味なくてね。あまりにもひどい文章読んだから,ついつい反応しちゃっただけで…。もう俺のことはいいんじゃあない?今後はほかの人たちと話しなよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 13:42 (UTC) 上記2名は一旦無視するとして(そもそも個人攻撃と思われる)、色文字、br改行、写真など概ね合意ある点に関しては削除しても問題ないのかなと思います。理科の部分は賛否両論ありますが、私はあくまでこのページは京大対策という点を鑑み、内容を適度に削るべきと考えます。--[[特別:投稿記録/240B:13:200:7800:C9B6:5686:B8AE:AC12|240B:13:200:7800:C9B6:5686:B8AE:AC12]] 2021年9月7日 (火) 13:23 (UTC) 了解しました。こちらも合意するところです。 ・色文字のリセット ・br改行の削除(適宜空白改行に置き換えで対応?) ・無関係な写真の削除(挿絵は適度に読みやすさを与えるので、文脈と関わりがあるものは数枚程度残すのもありだとは思いますが、みなさんはどうお考えでしょうか?) このへんは今週中に異論が出なければ(たぶん出ないと思いますが)、週末に修正版を反映させてしまっていいと思います。 ・その他思う箇所 英語についてですが、参考図書の項目の内容が明らかに竹岡広信の指導方針寄りの意見なのが気になります。京大英語の指導には予備校や有名講師ごとに流派や派閥のようなものがあり、特定の指導者の方針に肩入れしている内容をあたかも公式の学習スタイルかのように論を展開させていることも問題に感じます。参考図書のリストは削除が妥当かと個人的には判断しています。参考図書の解説欄の竹岡に関する捕捉説明も削除で良いと考えます。ただ指導する立場の者であっても、完璧な添削をすることは難しいといった説明箇所は普遍的に通用する捕捉と言えるため、残すのが妥当と判断しています。 数学も参考図書のリストは恣意性の排除という点から、赤本や青本の紹介を除き削除が妥当と判断します。 教学社の赤本(京都大学、一橋大学)、青本(京大入試詳解シリーズ)、京大模試問題集(河合塾と駿台予備校出版)については中立的な演習書であるため一旦残しておく方向が良いかと判断。 数学は理科と並び色々と賛否が分かれているようなので、ここもご意見があればお願いします。 ・出典タグについて(一次情報と二次情報の区別含む) 全体として出典タグを明記するときに、何をもって信憑性のある一次情報、二次情報とみなすかは統一的見解をもっておいた方が良い気がします。またオープンアクセスの困難な一般販売されていない書籍媒体や予備校の限定配布の冊子、小冊子、プリント物、テキストなどを出典として含めることはどこまで許容されるのかが重要な争点になると考えます。その行為自体が特定の予備校に対しての営業行為に当たらないかは危惧される所ですし、そもそも同時期同名の講座であっても開催場所や担当講師ごとに扱う内容や開示情報は異なるので、必ずしも情報の透明性が担保されることになるとは限らない気はしています。落としどころは必要、くらいの姿勢でこれをやると、かえって悪質になることもあります。そもそもですが、外部からの裏付けが難しい情報を出典として大手を振って扱う姿勢には懐疑的な立場です。出典タグを免罪符的に振りかざして悪用することも可能ですし、より巧妙な形でセンセーショナルな情報の隠れ蓑にされる懸念もあります。誰かの独断専行というよりも何らかの形で合意のステップが必要となることもあるかもしれません。考えだしたらこのヘンはキリがありませんが。  --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年9月7日 (火) 14:16 (UTC) 予備校等のテキストでは大抵「学内限り」や「塾内限り」などの記載があるためそれを出典とするのは難しいと考えます。また、予備校講師の発言内容も裏が取れないことを考えると情報源としては弱いのではないでしょうか。--[[特別:投稿記録/240B:13:200:7800:5DA:E78A:F121:5F1|240B:13:200:7800:5DA:E78A:F121:5F1]] 2021年9月9日 (木) 14:57 (UTC) 執筆した身として。 望まぬ争いや罵詈雑言の火種になるくらいなら白紙に戻した方がマシ。 客観性は中立を都合よく引き立てる魔法の言葉ではない。 ましてや自論を突き通すための大義名分でもない。 個々人のフィルターに通される以上はその弁解は通用しないし、知っている気がするだけで、そんなものは誰も知らないフィクションと同じ。 自覚してまだ続けたがるなら、それはただのペテン師。 記事の是非などという最大限の“見栄”を張ってただの醜い縄張り争いが続けられているだけ、というのが感想のすべて。 曲がった定規で知恵比べすることは、押しつけがましい憎しみにも勝るとも劣らない。 二つの陣営が、砂粒の価値にも満たない文字の相撲取り。 ただそれだけです。 携わった箇所は私名義ですべて削除しました。 以上です。 責任は感じています。 --[[特別:投稿記録/180.44.196.209|180.44.196.209]] 2021年9月9日 (木) 18:37 (UTC) :正直この180さんの文章はどういう意味か,私はよく読解できない。縄張り争いとか相撲取りとか,二つの陣営とか言うけど,それだけの言葉で客観視して済まされる問題だろうか?私自身はここはほとんど読んでないけど,以前罵倒したのは180さんの文章なのだと思う。見栄とかフィクションとかフィルターとかペテン師とかもっともらしい言葉が並ぶけど,全部言葉尻,言葉の勢いに頼って安心を求めているだけだと思う。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月9日 (木) 22:46 (UTC) >> Honooo氏へ 180氏の判断の是非は一旦置いておくとしましても、Honooo氏の一連の投稿は京大対策wikibooksの修正案についてなんら建設的な案を提示することなく、ただひたすら全方位に喧嘩腰で暴言を繰り返すだけで悪質です。以前の高校生の恫喝や執筆投稿者への粘着など不毛な書き込みでしょう。 以降におきまして、「投稿者個人を標的」とした返信(個人攻撃と判断)をくり返した場合、管理者に連絡させていただきます。 (管理者に一連の投稿に目を通していただき、利用制限や違反報告等の判断は管理者側に委ねることとします。ご自分のこれまでのここでの投稿を読まれて後ろめたいと感じられるなら、これ以上の個人攻撃はおやめください。あなたの一連の投稿を「個人攻撃」と認定するかは投稿者本人ではなく他人であることをご理解願います。 --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年9月10日 (金) 04:46 (UTC) :うーん,詳しいことはもう少し考えてから返答するけど,俺が思うに #まず,あなたの行動は完全に自由だからご自由にどうぞ。 #自分の行動については,全くってわけじゃあないけど,それほど後ろめたくない。むしろ180や高校生が今までの100倍後ろめたさ感じるべきだね。 #あと個人攻撃については…むしろ俺は狂ったサル山集団攻撃ってイメージ^^--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月10日 (金) 04:57 (UTC) :Tomzoさんが差し戻ししちゃったので,もう少しだけ書いておきますか…。私としてはむしろEvgremさんの措置で,厄介ごとから逃れられて助かるんですがね…。とはいってももうこの話はほんとにうんざりだなー。ほんとにめんどくさい連中にかかわってしまったようだね…。だから本論とは違うんだけど,しかし粘着っていうのは気持ち悪い言葉だね。なぜかあんたら京大関係者からこの言葉を聞くことが多いんだけど,何?学校ではやってるの?しかし多くの場合は悪行,不適切言論をし放題した奴が抗議されたときに,抗議した人をこう呼ぶシーンしか見たことがないんだけど…。だから超難関校,京大でございっていう割にはあんたらの発想って幼稚だよね。言葉に関しては既成の言葉自体の意味パワーに依存するだけ依存してるじゃん。もうちょっと言葉って何か考えてみろよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月10日 (金) 10:03 (UTC) では…このページの今後の建設的な発展のために少しは協力しますか…。果たしてうまく書けるかどうかはわかりませんが,このコメントを最後にこの項目は破棄して,新たな項目を作って議論すれば,このページの編集は今後も建設的に継続できると思います。 まあ皆さん私の発言は有害有害といいますが,まあ別に有害でもいいですが,アフリマン的な悪に対抗できるのは,ルシファー的な悪だけですよ。 まあ私の文章に関する善悪は考えないとして,この項目の中で問題があるのは,受験生氏と180氏の文章だけだと思っています。あとの方の文章はものすごく内容のある密度のある議論で,建設的だと思う。 とはいえこの項目自体長いし,密度も半端なく濃いので,しつこいようですが,ほとんど読んでいない,詳読はしていませんよ。 とりあえず私は180氏の本文文章は非常に問題があると思うけど,もはやすべて消されたのだろうし,180氏以前の状態に今は戻っているわけですよね。 だとしたら,全て仕切り直しでしょう。180氏の文章を修正するための議論はすべて白紙に戻ったのではないでしょうか? だとしたら,今後このページを発展させるためには,180氏以前の文章を基に,有志の方たちが編集を重ねていけばいいのではないでしょうか? まあお前が言うなってことでしょうが,私としてはこのくらいしか書けないですね。私自身は京大卒ではありませんが,大卒の時,大学院受験をするためにわざわざ京都に出向いて,まあ当時は情報の流通が今とはだいぶ違うので,そうすべきと判断したのですが,出願書を取り寄せたことがありますよ。ただ様々な事情で出願自体はしませんでしたがね。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月11日 (土) 07:55 (UTC) == 議論の進め方について == 出先で入力環境が悪いので簡潔に。 ノートページにおいては、議論の経過が不明になるため、無闇に除去しないでください。 自分の主張を取り下げる場合は、認め得ますが、それも打ち消し線による方が推奨されます。 他人の書き込みについては、その主張が、正しくない・的外れである・無関係であると考えるなら、その旨を主張して下さい。掲載に不適当な中傷等があれば、それは別途「不可視化」等で対応いたします。—--[[利用者:Tomzo|Tomzo]] ([[利用者・トーク:Tomzo|トーク]]) 2021年9月11日 (土) 00:17 (UTC) == リニューアル版のアンケート投稿スペース == こちらにご投稿ください。 [[特別:投稿記録/240A:6B:B10:BD65:84D0:7167:56C7:E1A9|240A:6B:B10:BD65:84D0:7167:56C7:E1A9]] 2021年10月29日 (金) 06:37 (UTC) 一応、京大出身で河合塾にて理系数学の指導歴あるから、自分が意見できるのは数学のみですが。 推薦書籍の掲載は不要だね。 これは消したのも妥当。 紹介する以上特定の予備校宣伝に抵触するんで、書けないが正しい。 年度別の大問難易評価も目安にはなるが各予備校、赤本、青本で評価も毎年バラバラだし統一できないんだから書かない方がいい。 wikiオリジナリル評価にしかならないし、ブログで書くなら別にいいがね。 んで、あと京大入試の採点方法や京大の部分点懐疑論は別に消す必要ないよ。 京大名誉教授の森毅が中公文庫から数学受験指南術っていう本出してて、その中に該当項目の記述あるわけだし。 出典明記できる箇所まで消すのはあかんが、前の版の本文長いからまあいちいち精査してられなかったんだろうけど。 議論読んだが全体的に雑だよ。 とても議論とは呼べない。 最近、ネットが流行ってから論破とかそういうしょうもない揚げ足取りのすったもんだで勝ち負け論にしたがる人らが増えたけど、止揚ってもんが下敷きに無いもんだからさ。 空中分解したの、みたいに解散?したのかな。 一人高校生相手に大人気ない対応してる人は問題外でかなり印象よろしくないけど、他の人たちも全体的に連携がとれてないでしょ、これ。 まああのまま残すのも問題があったわけだけど、出典明記をめんどくさがらずにやれば、半分以上は消さずに済んだよね、って感想。 [[利用者:Hvxv48nvzii3|Hvxv48nvzii3]] ([[利用者・トーク:Hvxv48nvzii3|トーク]]) 2021年11月3日 (水) 07:00 (UTC) :ハイハイ,偉い偉い。凄い凄い。賢い賢い。(^^)凸。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:06 (UTC) :↑↑じゃあお前のこの文章が大人の文章なの?馬鹿馬鹿しい,小学生だってもうちょっといい文章書くよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:24 (UTC) :解散も連携もなにも,みんな個人の資格で,あの狂った文章を何とかまともにしたかっただけ。集団の力学と,おかしな糞理屈しか頭にないお前が一番の糞--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:12 (UTC) :じゃあお前が凄いという議論ってどんなの?例を見せろよ(^^)凸--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:14 (UTC) :印象もなにも,Wikibooksも京大も,河合塾も大したもんじゃあないだろ?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:16 (UTC) :大体消さずに済んだっていうけど,書いたやつ自身が自分で消したんだからどうせーつうの?そんな偉そうなこと言うならお前がいい形に編集すればいいんじゃあねーの?だから,ここで話し合ってるうちに,書いてたやつがうんざりして消しちゃったんだよ,まあ俺のせいかもしれないけどね^^;;;。そもそもあいつの文章に,そんなに言ってかばう価値あるの?まあ俺はほとんど読んでないけど。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:33 (UTC) :そもそも論でいえばさー京大に合格することってそんな重要なことかね?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:35 (UTC) :そもそもさー,無料で読めるサイト,誰でも書き込めるサイトで,おかしな御託並べるなよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:58 (UTC) :それに今の文章が良くないみたいなこと言うけど,それもあんたらが絶賛する賢い男が自分で考えて自分で書いたんだよ?添削だの要請だの書いてるけど,それはあいつなりのジョークだと俺は思ってるけど。そもそもここで真面目に文章書いている人は,お互いにしめしあったり連絡とったりすることはほとんど,あるいはまったくないね。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 10:07 (UTC) :もうすでに重ね過ぎだけど………あなたももうアカウントを持ってるわけでしょ?そして京大卒河合塾で数学指導してた賢い人間なんでしょ?だったらさーここの過去履歴にあんたらが絶賛する素晴らしい文章がすべて残ってるわけだから,それを持ってきて切り張りして再編集して,ここであんたが宣った方針にまとめ上げて,up,上書きすればそれで済む話なんじゃあないの?それが妥当でいい内容だったら,誰一人文句なんて言わないよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 12:17 (UTC) == では… == 本来は差し戻してから書くべきかもしれないね,スパゲティになっちゃうし,でもなんかこの上に書いたほうがいいような気もしてね,まず誹謗中傷だから消すってことだけど,そうねー,じゃあ高3受験生と,Hvxのも消せばって思うけど,でも誹謗中傷ではないかもね,うんざりするほど不愉快な文章ではあるけど…でもさー「一人高校生相手に大人気ない対応してる人は問題外で」ってのは結構誹謗中傷的じゃあない?大人げないは許せるけど問題外は腹立つね,これがなければもうちょっと柔らかい反応したかもしれない。しかしいまごろ,ツイッター界隈や現実の京大界隈では,馬鹿馬鹿しい奴らが醜い顔つき合わせて,まあまともな人はこんなこと大した興味ないだろうけど,インチキなおしゃべりがかんかんがくがくされてるのかね?俺はツイッター否定派でね,アカウントも持ってないし,基本ほとんど見ない。でも情報収集のため,あるいはある程度気に入っている方のため,ごくときどきはWebでみるよ。今回の180の京大対策の文章を面白がってた馬鹿馬鹿しい奴が多くいるのは知ってるし,最近見たのはここのページで,「後半,煽りたいだけの奴がいたな」なんてのも見たことがある。それ俺じゃん^^:::。しかし京大の学生ってさー煽りとか粘着とか,馬鹿馬鹿しい安易な言葉を得意げに振り回して物事分かった気になってる低能も結構多いんだね。もちろん,ちゃんとした知的な真面目な人もいっぱいいるだろうけど…。まあとにかくあんたら,自分が賢いと思い過ぎて傲慢になりきってるやつらではなしあって,何とかこのページまとめてみたら?俺についての言及がなければもお俺は関わらないよ。ほんとうんざり。あ,いやでも,あまりにもひどい書き込みがあれば,やはりなんか書いちゃうかもね。一応俺もWikibooksの参加者だからね。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月4日 (木) 11:27 (UTC) == 議論の進め方について2 == [[#議論の進め方について|上]]に書いたとおりです。 議論に関係あるか否かの判断は、個人がすべきではありませんし、たとえそうであったとしても、その旨を指摘・主張すべきです。また、掲載に誹謗中傷を含めた不適当な表現等があれば、「除去」するのではなく、その旨(どの部分が、なぜ掲載するのに不適当なのか)を主張し、コミュニティの合意を得て「不可視化」すべきです(個人情報等に絡んだものについては緊急に対応することはあります)。 本文の内容にあまり関心がないので、以下、個人的意見ですが、この議論は論点が発散しているように思えます。本文について、何を、なぜ除去すべきか、又、残すべきかをポイントを列挙し、個々に議論することをお勧めします。その際の観点としては、まず、その記述が、誰かによって主張され、それが書籍等によって確認できるか(すなわち、「出典があるか」「独自の研究ではないか」)という観点がキーとなると考えます。 また、ここの記述については、ウィキペディアにおける「[[w:Wikipedia:礼儀を忘れない|礼儀を忘れない]]」「[[w:Wikipedia:エチケット|エチケット]]」を心がけていただくようお願いします。--[[利用者:Tomzo|Tomzo]] ([[利用者・トーク:Tomzo|トーク]]) 2021年11月4日 (木) 13:44 (UTC) == 自由発言スペース(議論の進め方への感想など) == お久しぶりです。 攻撃的な言葉を用いることをまずどうか控えてください。 上記投稿がありますので、中から抜粋しますと、「馬鹿馬鹿しい奴らが醜い顔つき合わせて」、「インチキなおしゃべりがかんかんがくがく」「馬鹿馬鹿しい安易な言葉を得意げに振り回して物事分かった気になってる低能」「自分が賢いと思い過ぎて傲慢になりきってるやつら」など、他に言い様があるように思います。 それらをここで書き残す必要性も含めて。 また先日の河合塾講師に向けた投稿内でも、10回も連続して投稿する必要がありましたか? 指を突き立てる絵文字などを含めて野蛮でしかありません。 --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年11月4日 (木) 15:11 (UTC) :うーん,だからあんたら京大関係者は,一応は賢い知性のある人間たちなんだからさー。俺がここに前に書いた,「アフリマン的な悪に対抗できるのは,ルシファー的な悪だけ」という言葉の意味を考えてほしいんだよね。アフリマンとは何なのか?ルシファーとは,サタンとは何なのか?何故悪に対して正義では勝てず,悪をぶつけるしかないのか? :攻撃的な言葉控える,10回もいらないっていうけど,この手の悪徳には,この10倍辛らつな言葉をぶつけても,現実には蛙のつらにしょんべんだよ。 :Tomzoさんに対するあなたのコメントを読んでみると,「ツイッターなど他媒体のSNSで議論版での彼の発言が取り沙汰されているようで、」なんて書いてあって,いやー聞きたくない情報,ますますツイッターなんか見ないのが正解だね。 :だからやっぱりあなた方に聞きたいのは,[[w:アフリマン]]っていったい何だと思う? :それからTomzoさんのトークページの最新版見たけど,俺の発言があるから本題の議論しづらいというのは分かるけど,結局これは議事記録だからね。できるだけオリジナルはそのままにしないと…。だから俺の提案としては,俺という大馬鹿^^;;;の相手する項目と,本題のこのページの発展のための議論と二つ項目作ったら?だけど結局此の先混ざっちゃうと思うけど^^;;;。それはお前次第だろ?お前のせいだろって言われればその通りなんだけど^^;;;……。あっでもこの議論スペースが,俺の論点に関する項目だね。だからあなたが不愉快な内容消したいというのは分かるんだけど,やはり本題のための項目を新たに作って,今までの議論経過まとめて書いてから,スタートするといいと思うけど… :まあそれじゃあ俺の馬鹿話が気になって人が集まらないって言いたいんだろうけど…でもそれはどうしようもないなー。それだったらあんたがたこの話題に興味ある人たちが集まってむしろ,京大入試対策Wikiなんか作ったほうがいいんじゃあないの? :まあでもね,それは現実の受験業界と絡む話になるから,結構難しいかな? :なんか今急にエヴァンゲリオンのこと思い出したよ。♪残ー酷な天使のテーゼ,これって[[w:ルシファー]]のことなのかな?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月4日 (木) 20:17 (UTC) == 個人所有時計の全面禁止について == Wikibooksに限らず他のWebサイトやSNS,それどころか大手予備校の作成する実戦模試ですら周知されていない("本試では個人時計の利用が禁止されている"とアナウンスされる)のですが,令和8年度学部入試から時計機能に限ったアナログ時計に限って卓上に置くことが解禁されています. [https://www.kyoto-u.ac.jp/sites/default/files/inline-files/ippanbosyuyokoR8_all-52cb31b1c0bbdc1bcd0b0a9bb4c2e70f.pdf#page=38 令和8年度一般選抜要項 34ページ]--[[特別:投稿記録/~2026-57700-00|~2026-57700-00]] ([[利用者・トーク:~2026-57700-00|トーク]]) 2026年10月29日 (木) 19:06 (UTC) drefll1fjua8yuf599aowa6dyjge6se 305171 305170 2026-10-29T19:07:58Z ~2026-57700-00 92903 /* 個人所有時計の全面禁止について */ 305171 wikitext text/x-wiki 参考図書の欄が削除されたのはなぜでしょうか。 <small>''([[User:218.224.97.93]]によるコメント、2008年7月28日 (月) 15:24 (UTC)に[[User:Ninomy|Ninomy]]が追加)''</small> 私も参考図書の欄があってもいいような気がしますが…。--[[特別:Contributions/125.194.86.113|125.194.86.113]] 2008年7月28日 (月) 13:07 (UTC)  : コメントありがとうございます。私は削除の編集を行ったユーザーではありませんが、コメントをさせていただきます。まず、ウィクショナリーは宣伝の場ではないですが、特定の本を「推薦図書」「参考図書」とすることは宣伝と取られる可能性があります。このユーザーはそう判断して削除したのかもしれません。また、このような「推薦図書」を示さなくとも、ウィクショナリー内でその大学の対策をできるような本を執筆することだってできます。そう考えれば、特に参考図書を示さなくてもいいのかもしれません。ただし、受験参考書の中には良書として長年使われているものもあり、それを紹介するのは悪いことではないとも思います。しかし、何を良書とするかには意見が分かれるところもあり、絶対の基準もない以上、私は載せるべきではないかなという風に考えますが、最終的な判断はここで議論して結論していただければよいと思います。--[[利用者:Ninomy|Ninomy]]<small>-[[利用者‐会話:Ninomy|chat]]</small> 2008年7月28日 (月) 15:24 (UTC) 京大対策の序文に関して、「~大学と共に~である、」等という表現が、「大学間の比較は不要」として何度か削除されているようですが、(確かに編集合戦になりがちな箇所ではありますが。)早稲田大学や慶應義塾大学の序文においては前文のような表現が許されているのは何故なのでしょうか。どなたかご教授願います。--[[特別:Contributions/125.194.86.113|125.194.86.113]] 2008年8月5日 (火) 09:07 (UTC) 確かに早稲田・慶應やその他の大学のページでは「~大学と共に~である、」といった表現が使われていますが、そもそもこれらの表現をwikibooksに載せるべきではないと思います。そうであってもどうにもこうにも他と比べたがる人間もいるもので削除されること無く掲載され続けていたり削除→追加→削除…が繰り返されたりしているのが現状だと思います。どの大学までが難関か、どの大学とどの大学が同レベルかといったことは主観的なものであり、一般的に日本で「東大京大」「旧帝大」「早慶」「MARCH」「関関同立」……というグループ表現や難易度レベルのグループが知られているとしても、中にはそれらに不賛成であり不満を抱く人もいるわけです。結果、おっしゃっている通り編集合戦が起こります。それを回避するには元から「~大学と共に~である、」という表現を用いないのがベストだと思います。(少し前の話ですが「日本の大学受験ガイド」のページでも大学序列をめぐって争いが起きました)。このような表現を載せている他大学の対策ページではそんなに編集合戦が起こっていないものもあるじゃないか、という意見もあるかもしれませんが、だからと言って本項でもそのような表現を載せてもいい、ということにはならないと思います。先ほども言ったとおり大学間の難易度は非常に争いを招きやすく、「日本の大学受験ガイド」でも大戦争が起こりました。京大対策のページでは、他大学のページでも難易度比較が載っているから…という安易な理由で載せるのではなく、現状では些細な因子でも将来は争いのもとになるかもしれないので、もともと載せないようにする、という方針が最良だと思いますがいかがでしょうか。大学間の比較はおいといて、京都大学が日本の大学の中で最高レベルであるのは間違いないのですから、現在のように他大学と比較することなく「国内最難関大学として知られている」という表現に留めておくので十分ではないでしょうか。--[[特別:Contributions/210.131.4.176|210.131.4.176]] 2008年9月5日 (金) 05:53(UTC) お返事のほう、読ませていただきました。私も「国内最難関大学(のひとつ)として知られている」という表現で特段問題はないと思います。仰る通り、主観の入り易い大学比較は荒らしを生む火種となり易いようですし、それによってこのページに対する信頼が揺らぐようであれば非常に残念なことだと思います。今回はご教授いただき、有難うございました。 --[[特別:Contributions/125.194.86.113|125.194.86.113]] 2008年9月5日 (金) 07:04 (UTC) == 京大の青本25年シリーズ == 京大の青本の25年シリーズが発売されているので、対策の欄に赤本の同様のシリーズと併記した方が良いと思うのですが、いかがでしょうか? == 全体的な問題点の指摘 == 再度差し戻しをされたようですので、少し問題提起を。確かに先日の差し戻しはやりすぎたかなという気もしましたが、やはり現状としては先日の差し戻し概要で述べたように、本記事およびその子記事(特に理科)は「情緒的、冗長、強迫的な記述であり、かつ真偽不明の噂話まで含み有害」です。以下、具体的に指摘いたします。 *出典の問題 主語が「某大手予備校講師」など誰が言ったのかを検証しがたい記述が多数見られます。ウィキペディアなら容赦なく要出典などのタグが張られまくる内容ですね。確かに、予備校講師の授業中の話などに有益な情報がある場合もありますし、速報的な内容は文章化されにくい場合もあること、それゆえに出典表記しにくいものがあることは認めます。しかし、まずは客観的に裏打ちできるテキストや参考書などを出典にした方がはるかに受験生に役立つと思います。 例えば、本記事の「アドミッションポリシー」。これ、いったい何が根拠なんですか。京大の公式サイト? それとも受験案内? もし京大が公式で述べている乃至それを基にしているのであれば、ちゃんと出典を示すべきです。それとも予備校の分析ですか? それならどの予備校かくらいは書くべきでしょう。 また、[[京大対策/理科]]や[[京大対策/数学]]の難易度表は何が根拠ですか。赤本? 予備校の分析? それとも、記述者の分析? 前2者なら剽窃ですし、後者なら主観的記述です。 せめて、逐一出典を書くことができなくとも参考文献一覧くらいはあった方が受験生のためにもなるでしょう。「受験生の役に立てば多少出典がいい加減でもいいんだ」というのは、研究者・学者養成を謳い文句にする京大に対して大変に失礼でしょうし、京大受験生の姿勢としてもあるまじきものです。 *大げさすぎる記述・情緒的な表現 流石に削除されたようですが、京大理科の「2020年度京大入試嘔吐失神事件」はいろいろな意味で「本当かよ」と思う内容でした。それにとどまらず、とかく大言壮語・誇張したのではないかと言いたくなるような記述が目立ちます。 例えば、本ページ・英語の「この問題(注:表面的な日英間の相互変換)はかねてより、京大が大変な危惧をもって慎重に扱うテーマであり、この思想が往年より初志貫徹といった具合にはっきり大学入試に反映されているのは、日本の大学入試においては京大が唯一といってもいい。」という記述。本当なんですか? まぁ、私が不勉強なだけだと言えばそれまでなのですが。 他にも「日本の大学入試の歴史の中において前例の無い事態」などのように傍から見れば大げさな記述な何の脚注もなく記載されています。 それと関連して、本ページと理科のところにある「予備校化学業界の金字塔」。これ、このままだと記載されている講師の個人宣伝になってしまうのではありませんか。 また、生物に顕著ですが、読み物乃至は個人のブログのような記述が目につきます。例えば、「古典遺伝学」のところ。20行近く本筋と関係のないことが書かれていると思うのですが。 「京大に入ろうと思うのならば受験内容に留まらず、このくらいは知っておくべきなのダ」と言いたいのかもしれません。それならば、子ページに「京大受験生が読むべき文献」といったページを作り、文献の紹介をした方がすっきりすると思うのですが。(それこそ、京大を志す人が文献のあんちょこのごとき記述で満足したら恥ずかしいと思うよ) *編集 まず、<br>(全角文字にしています)の多用は勧められません。必要がない限り、改行は一行空けですることが推奨されます。また、青字・赤字などの色付きフォントも勧められなかったような気がしますね。 あと、私の方で直しましたが「入試後の過ごし方」は最後の方でしょう。その他、章立てや記述順は見直した方がいいんじゃないかなと思うところが少々。 以上、問題提起させていただきました。編集者の皆様のご意見などがいただけましたら幸いです。私は返信が遅いので、気長にお待ちいただけましたら幸いです。 --[[特別:投稿記録/2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92|2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92]] 2021年9月5日 (日) 11:33 (UTC) 少なくともI氏含めた予備校講師関連の話題、難易度表、参考図書、理科における入試と直接的には関連しない分野の話題、写真、その他客観性を保てない分野は一旦削除すべきと考えます。またこのページはあくまで京大について記述する場所であるため、「日本の大学受験ガイド」のページにある通り他大学についての情報も除去することが望ましいと考えます。 さらにこのページの投稿記録を遡るとほとんど同一IPによる編集であることが分かるため、主観の入る部分が大きいと考えられます。 以上を踏まえ、少なくとも上記の一については削除を実行すべきと考えます。皆様のご意見をお願いします。--[[特別:投稿記録/240B:13:200:7800:C9B6:5686:B8AE:AC12|240B:13:200:7800:C9B6:5686:B8AE:AC12]] 2021年9月5日 (日) 12:22 (UTC) :早速のご意見ありがとうございます。あえて書きませんでしたが、受験とは関係のない写真もいろいろ載っていて、余計な情報量が多く何のためのページなのか首をかしげたくなります。正直、今のページは受験生向けというよりも、京大在学生・卒業生および「受験マニア」向けの読み物という観があります。おっしゃられた部分の削除が現状妥当だと思います。--[[特別:投稿記録/2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92|2404:7A86:8800:1C00:68F9:BAF3:44E3:7A92]] 2021年9月5日 (日) 13:40 (UTC) 拝読させていただきました。 上記において指摘に上がっているように、情報の大元をたどることが難しい、あるいは巧妙に伏せられている? と思しき曖昧な記述が目立つ点について概ね同意します。適宜修正が加えられていくべきとこちらも判断しているので、私以外も含めて京大対策ページの開設者、執筆担当者本人もまじえてここで建設的に議論を進められればと思います。 現状の京大対策wikibooksは有益な情報と客寄せを目的としたと思えるようなセンセーショナルな記述が玉石混淆の状況であり、後者の記述が前者の有益な耳寄り情報の価値をくすませてしまうことは好ましくないと感じています。乱暴に一括削除するよりも、丹念にたどれる真偽についての選り分け、可能なものについては出典タグを添えるなど長丁場の添削作業を有志で連携して行うのが賢明かと思います。 ここでの議論が開設者と執筆担当者の目に触れれば、この作業が多少楽にはなるかと思いますが。ひとまず何人集まるか次第でしょうか。 英語、数学、国語、理科のすべてについて丹念に情報の真偽を検証していくことには数カ月スパンはかかりそうなので。 ・英語 予備校の解答速報舞台裏の記述は誇張が過ぎるため明らかに不要と判断。そもそも事実確認が不可能であり、内輪ネタの記載は他の情報の信憑性を汚染するだけ。英語は予備校や塾の講習会と大学の講義雑談の出典記載は困難だが、京大参考書の講義CDや書籍なども英語については潤沢なので、出典となる書籍の探り当ては他の教科と比べたら容易であろう。京大担当の有名講師、竹岡、櫻井あたりの話が元になっていると思われる。確認と洗い出しが必要。英作文については京大公式の注意文とwikiの執筆者の記述が混在しているためわかりやすい区別が必要。竹岡が「赤本の英作文解答例を講習会で酷評」のくだりは有名事実であるが、この書き方が赤本のネガティブキャンペーンに当たらないかは慎重になるべき。他の利用者の意見も確認すべきか。 ・数学 数学の採点現場の記述は名誉教授の森重文の書籍、当時の京都大学における講義中の談話が由来かと思われる。後者はレジュメや口伝が情報ソースなので開示は困難ですが、前者であれば出典明記が部分的に可能でしょう。また各大手予備校(河合塾、駿台、代ゼミ、東進)の京大講習会配布のプリントや小冊子、講師の雑談が元になっているものも散見されるので、この部分をどうするかが課題の一つ。 採点の厳しさは毎年異なっており、本番の採点で完答主義がどこまで徹底されているかは予備校講師の間で藻意見が対立しているはずなので、そうした立場が分かれていることは明記しておく方が無難。 少なくとも近年は2010年前後のような徹底した完答主義ではないはず。ここも要検証と議論が必要。 ・国語 国語は高得点域の不在は主観的には嘘ではないと思われるが、公式データが無いため断定口調の表記は疑問。京大採点官について「思春期の読書云々」のくだりは不安を煽るリスクのある記述だと感じる。京大の講義での雑談と記載されているため出典の明記は困難? 大学入試分析会の配布資料に根拠となる記述が見つかればPDFのリンクを貼って対処すべき。「6割以上の高得点が至難」という記述についてはややオーバーと思ったが、例年の開示と京大模試の偏差値表から判断すれば妥当と結論。京大入試詳解現代文の執筆者の松本孝子の書籍と教員向け配布資料にも類似の記載を確認。得点分布域表の項目における国語の得点戦略の記述は主観的記述と思われるので蛇足と判断。表だけ残すのが妥当? 意見求む。 ・物理 物理は「嘔吐事件の記述」は不要と思われるが、Youtubeチャンネルにて京大受験生が事実と発信している動画があり、夏期の予備校講習会でも雑談として言及があったようで、真っ赤な嘘とも言い難い。 ただ仮に事実を含むとしても、過剰な恐怖心を煽る書き方に問題があるため削除は妥当と判断した。 ・化学 化学は「石川正明」を過剰に持ち上げる記述が気になる。執筆者が石川正明のファンであろうと思われるが、結果的に予備校講師のPRをwikiに掲載しているようなもので好ましいとは思えず。 頻出項目の記述、理論、無機、有機の内容は膨大であるため整理が必要なのは同意。ただし高得点を望む層にとってかなり有益な内容を含んでいる。ただ模試の内容と本試の内容をもっと区別して記述を整理した方がわかりやすい。模試の出題内容や出典年度について確認できる範囲で照合した限りは嘘の記述は見当たらなかったため、完全削除はさすがにやりすぎと判断。ただし記載の学習習熟度の要求水準が京大受験生の一般的水準よりも高く、医学科受験生をターゲットにしていると思える記述も混在しているため、目標得点や志望学部に応じた到達点の区別をもっと明確にすべきと思われる。 1.特定の個人のPR色の強い記述を削除、2.誇張表現箇所を部分的に修正の2点にひとまずしぼって整理していくのがよさそう。他にもなにかあれば意見求む。 ・生物 生物は分野の背景説明が豊富だが、有害とは感じないため削除の必要性は感じない。むしろ個人的には教科書に記載の無いバックグラウンドの紹介は有益にも思えるので、どう扱うかは他の編集者との議論や閲覧者の意見聴取が必要。削除された版では情報らしい情報がまともに残っていなかったため、どういったスタンスで統一するかをまずはっきりさせた方がよさそう。「客観性」にこだわりすぎると毒にも薬にもならない記述しか残らない。突き詰めれば受験指導は「主観的体験」の積み重ねで、どれだけそれを無限に厚くしても客観性に生まれ変わったりはしない。主観色イコール不要記述は潔癖症が過ぎると思われる。 ・模試のくだり 京大模試の日程の項目の削除は不要と判断したが、京大模試の作問の舞台裏の記述は、どこの予備校の舞台裏かさえ不明なので削除が妥当。(伏せられていたの葉執筆者の身バレ防止目的か?) 作問担当のくだりは明らかに不要な記述のため削除は妥当と判断した。ただし模試と本試の採点の相違は周知の事実であり、また勘違いしたままの受験生への注意喚起にもなるため、出典と思われる駿台発行の「京大入試突破レクチャー」を明記するなどして残すことも検討すべきか。意見求む。 ・得点戦略のくだり 「京大国語の伝説」のくだりは明らかに根拠不明のため掲載取り下げの継続が妥当。「京大数学の配点の重要性」の項目は、受験生一人一人の得点戦略という個人の領域への押しつけがましさを感じさせたため、同様に掲載取り下げの継続が妥当。 ・学部説明のくだり 「各学部紹介の項目」は完全なPR文であり、対策という主旨と乖離しているため削除は妥当と判断した。また最低点推移の表も予備校サイトや赤本、青本に掲載が見られるため。わざわざ容量をとってまでの記載は不要と判断した。削除は妥当と判断したが、異論がある可能性もあるので他の意見待ち。 ・その他 指摘に上がっているように、1.br改行の多用、2.太字の乱用、3.色文字の使用は明らかに見直されるベき。太字の乱用のせいでかえって読みづらい。また色文字はそもそも不要と個人的には思う。 長くなったので、一旦ここで返信と他の利用者、執筆者、開設者等の意見待ち。  --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年9月5日 (日) 14:24 (UTC) 京大志望の高校生ですが、横から失礼します。 編集の事情は疎いので、編集の是非の打ち合わせに加わる意思はありません。 自分は関西の高校に通ってますが、僕も僕の同級生も少なくない人が定期的にここの記事を参考にしてるので、予告なくいきなり削除するのはやめてほしいです。特に数学の類題問題のとことか、化学の解説はけっこうな人が頻繁に使ってます。 あとさ化学のどのへんが有害で強迫めいた内容なのか僕にはよくわからないのですが。 とりあえず削除した直後の記事がスカスカすぎ。あんなもん誰が参考にするの。特に英語、数学、生物とか中身なんもなくなってんじゃん。消すことへのこだわりこじらせすぎるほうが有害じゃないですか。純度100パー確度の情報にこだわった結果人が見なくなったら本末転倒。 あとツイッターやツイキャス配信で削除に怒ってるひと他にもいるからこれ思ったの自分だけじゃないはず。 とりあえず数学の類題紹介の削除だけはホント勘弁して。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月6日 (月) 13:09 (UTC) :こんばんはー。私は基本的にはここで、大学入試対策関係のページは一切見ないし、あまり興味もないんですよ。今回のコメントも、きちんと読んだのは受験生ですさんのコメントだけです。しかしこの京大対策のページ、以前ちらっと見たんですが、恐ろしく馬鹿馬鹿しい内容にしか見えませんでしたね。もちろん勉強としてはそれなりに内容があるんのは認めますが、しかし書いてる奴は恐ろしく性根腐った糞野郎だな、なんて思った。だから、最近のここを書きなおそうという試みは、少なくとも私にとってはいい流れに見える。あと内容について消されると困るとのことですが、ここは過去の編集は全て記録に残ってるんです。ですからもちろん定常になければ見るのは手間がかかりますが、完全に無くなってしまうわけではない。あんたも自分が賢くてすごい人間だと思い込んでるのなら、それくらい手間をかけてみたっていいんじゃあないの?見る人がどうのって言うけど、基本的にここは、市販の書籍とは違う世界でね。売れて金が手に入ればえらいわけではない。と、いうか、以前の狂った内容のほうがいいと思う人間しか京大に行かないんなら、もうこの国は終わりだろう。もちろん世の中、声のでかい奴ほど下らん奴でね。ツイッターでのでかい声なんか何の意味もないよ。そしてもちろん、お前らと違ったまともな人間も、東大京大には進学するだろう。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月6日 (月) 19:35 (UTC) どうも。 Honoooさんの返信を読ませていただきました。 昨日も書きましたが、記事をどういう方向で手直ししてくかみたいな話は自分は記事を編集する側の人間じゃないので参加しません。 だから記事がどうあるべきかのような美学みたいなのは語れません。 ですが、いきなり高校生相手に「自分が賢くてすごい人間と思い込んでる」とか「お前らとはちがったまともな人間も、東大京大に進学するだろう」とか何でいきなり口汚く罵られないといけないんでしょうか? そもそも東大はぜんぜん話と関係ないですよね。「この国は終わりだ」とかも大袈裟すぎじゃ。 編集の世界がすべてみたいに一方的に語られて、部外者が軽々しく口出ししてくるなみたいな威圧的な態度に感じました。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月7日 (火) 01:38 (UTC) :そう?とりあえず今はやらなきゃいけないことがあるから,もうちょっと後で詳しいことは書くけど,あんたの最初の文章の態度は問題ない?本当に礼儀正しい丁寧な文章かね?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 01:58 (UTC) Honoooさんへ たしかに僕自身も最初の書き込みで、削除側のスタンスに対して否定的な発言をしています。 感情がこもった言い方そのものに不快を覚えたのなら謝ります。 ただ僕がつっこみを入れたのはあくまで記事の処遇の流れに対してで、特定の個人を悪く言ってはいないです。 いきなり僕個人や自分のクラスメイトを指して、「お前」呼ばわりをしたり、なんの脈絡もないのに「東大京大に進学するやつは」みたいな強引な話の持っていき方は、今読み返しても執拗で怖いです。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月7日 (火) 02:15 (UTC) :まあいいからちょっと待てって。今日の夜まで待っててくれ^^--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 02:36 (UTC) :では,夜も更けてきましたので…。とは言っても,最初の文章で言いたいことは全部書いてしまいましたし,特に今回,何らかの反論をする必要も全く感じませんね。そこで一点だけ書いておきます。受験生さんは,私の文章が執拗で怖いと書いていますが,貴方みたいな人やそのクラスメイト達,学校の勉強はできるけどそれ以外は何もない,善意もない,勉強を超えた物事に関する理解もない,そういう人たちが集まって集団化して,自己満足と自惚れに浸って恍惚としながら顔を見合わせて笑っている,そういう場に出くわしたあなた方以外の人間の感じる恐怖は,貴方の感じた恐怖の100倍はあるよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 10:24 (UTC) Honoooさんへ まず前提の確認ですが、自分は記事一つに意見を挟んだだけです。 僕やクラスメイトの私生活やパーソナルな一面さえ何も開示していないのに、「学校の勉強はできるけどそれ以外は何もない,善意もない,勉強を超えた物事に関する理解もない,そういう人たちが集まって集団化して,自己満足と自惚れに浸って恍惚としながら顔を見合わせて笑っている」 こんなふうに一方的に決めつけて、しつこく喰ってかかってきていることが、双方向性の理解を放棄しているようにしか映らないです。 「善意がない、集団化して自己満足とうぬぼれにひたって笑ってる」と言われても困りますし、僕の返信のどの部分の内容から、話がここまで飛躍するのか、一向にピンと来ません。 ここまで目のかたきにされるとは思いませんでした。 「勉強ができるだけで社会のことを分かっていない」というのは、自分はまだ未成年の学生ですしまともな社会経験も無いのでもっともだとは思います。しかし記事への感想一つから、僕や同級生の人間性や僕の所属する高校やコミュニティがなぜこき下ろされているのでしょうか。 あの投稿から、人間性は読み解けるわけはないでしょう。対面でも相手の本質を理解することは人間にとって難しいはずなのに。人間性を見抜いてるんだと、あなたがひとりよがりになって錯覚しているだけだと思います。 それに言葉の節々から攻撃性をどうしても感じてしまいますし、意見がわずかでも食い違う相手を一方的に敵視して、説き伏せるというよりもねじ伏せようとしているように思います。 —-[[利用者:高3受験生です|高3受験生です]] ([[利用者・トーク:高3受験生です|トーク]]) 2021年9月7日 (火) 11:00 (UTC) :うーん,で,この先どうする?240Bさんには無視されちゃったようだし^^;;。私的には京大にもあなたにも大した興味なくてね。あまりにもひどい文章読んだから,ついつい反応しちゃっただけで…。もう俺のことはいいんじゃあない?今後はほかの人たちと話しなよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月7日 (火) 13:42 (UTC) 上記2名は一旦無視するとして(そもそも個人攻撃と思われる)、色文字、br改行、写真など概ね合意ある点に関しては削除しても問題ないのかなと思います。理科の部分は賛否両論ありますが、私はあくまでこのページは京大対策という点を鑑み、内容を適度に削るべきと考えます。--[[特別:投稿記録/240B:13:200:7800:C9B6:5686:B8AE:AC12|240B:13:200:7800:C9B6:5686:B8AE:AC12]] 2021年9月7日 (火) 13:23 (UTC) 了解しました。こちらも合意するところです。 ・色文字のリセット ・br改行の削除(適宜空白改行に置き換えで対応?) ・無関係な写真の削除(挿絵は適度に読みやすさを与えるので、文脈と関わりがあるものは数枚程度残すのもありだとは思いますが、みなさんはどうお考えでしょうか?) このへんは今週中に異論が出なければ(たぶん出ないと思いますが)、週末に修正版を反映させてしまっていいと思います。 ・その他思う箇所 英語についてですが、参考図書の項目の内容が明らかに竹岡広信の指導方針寄りの意見なのが気になります。京大英語の指導には予備校や有名講師ごとに流派や派閥のようなものがあり、特定の指導者の方針に肩入れしている内容をあたかも公式の学習スタイルかのように論を展開させていることも問題に感じます。参考図書のリストは削除が妥当かと個人的には判断しています。参考図書の解説欄の竹岡に関する捕捉説明も削除で良いと考えます。ただ指導する立場の者であっても、完璧な添削をすることは難しいといった説明箇所は普遍的に通用する捕捉と言えるため、残すのが妥当と判断しています。 数学も参考図書のリストは恣意性の排除という点から、赤本や青本の紹介を除き削除が妥当と判断します。 教学社の赤本(京都大学、一橋大学)、青本(京大入試詳解シリーズ)、京大模試問題集(河合塾と駿台予備校出版)については中立的な演習書であるため一旦残しておく方向が良いかと判断。 数学は理科と並び色々と賛否が分かれているようなので、ここもご意見があればお願いします。 ・出典タグについて(一次情報と二次情報の区別含む) 全体として出典タグを明記するときに、何をもって信憑性のある一次情報、二次情報とみなすかは統一的見解をもっておいた方が良い気がします。またオープンアクセスの困難な一般販売されていない書籍媒体や予備校の限定配布の冊子、小冊子、プリント物、テキストなどを出典として含めることはどこまで許容されるのかが重要な争点になると考えます。その行為自体が特定の予備校に対しての営業行為に当たらないかは危惧される所ですし、そもそも同時期同名の講座であっても開催場所や担当講師ごとに扱う内容や開示情報は異なるので、必ずしも情報の透明性が担保されることになるとは限らない気はしています。落としどころは必要、くらいの姿勢でこれをやると、かえって悪質になることもあります。そもそもですが、外部からの裏付けが難しい情報を出典として大手を振って扱う姿勢には懐疑的な立場です。出典タグを免罪符的に振りかざして悪用することも可能ですし、より巧妙な形でセンセーショナルな情報の隠れ蓑にされる懸念もあります。誰かの独断専行というよりも何らかの形で合意のステップが必要となることもあるかもしれません。考えだしたらこのヘンはキリがありませんが。  --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年9月7日 (火) 14:16 (UTC) 予備校等のテキストでは大抵「学内限り」や「塾内限り」などの記載があるためそれを出典とするのは難しいと考えます。また、予備校講師の発言内容も裏が取れないことを考えると情報源としては弱いのではないでしょうか。--[[特別:投稿記録/240B:13:200:7800:5DA:E78A:F121:5F1|240B:13:200:7800:5DA:E78A:F121:5F1]] 2021年9月9日 (木) 14:57 (UTC) 執筆した身として。 望まぬ争いや罵詈雑言の火種になるくらいなら白紙に戻した方がマシ。 客観性は中立を都合よく引き立てる魔法の言葉ではない。 ましてや自論を突き通すための大義名分でもない。 個々人のフィルターに通される以上はその弁解は通用しないし、知っている気がするだけで、そんなものは誰も知らないフィクションと同じ。 自覚してまだ続けたがるなら、それはただのペテン師。 記事の是非などという最大限の“見栄”を張ってただの醜い縄張り争いが続けられているだけ、というのが感想のすべて。 曲がった定規で知恵比べすることは、押しつけがましい憎しみにも勝るとも劣らない。 二つの陣営が、砂粒の価値にも満たない文字の相撲取り。 ただそれだけです。 携わった箇所は私名義ですべて削除しました。 以上です。 責任は感じています。 --[[特別:投稿記録/180.44.196.209|180.44.196.209]] 2021年9月9日 (木) 18:37 (UTC) :正直この180さんの文章はどういう意味か,私はよく読解できない。縄張り争いとか相撲取りとか,二つの陣営とか言うけど,それだけの言葉で客観視して済まされる問題だろうか?私自身はここはほとんど読んでないけど,以前罵倒したのは180さんの文章なのだと思う。見栄とかフィクションとかフィルターとかペテン師とかもっともらしい言葉が並ぶけど,全部言葉尻,言葉の勢いに頼って安心を求めているだけだと思う。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月9日 (木) 22:46 (UTC) >> Honooo氏へ 180氏の判断の是非は一旦置いておくとしましても、Honooo氏の一連の投稿は京大対策wikibooksの修正案についてなんら建設的な案を提示することなく、ただひたすら全方位に喧嘩腰で暴言を繰り返すだけで悪質です。以前の高校生の恫喝や執筆投稿者への粘着など不毛な書き込みでしょう。 以降におきまして、「投稿者個人を標的」とした返信(個人攻撃と判断)をくり返した場合、管理者に連絡させていただきます。 (管理者に一連の投稿に目を通していただき、利用制限や違反報告等の判断は管理者側に委ねることとします。ご自分のこれまでのここでの投稿を読まれて後ろめたいと感じられるなら、これ以上の個人攻撃はおやめください。あなたの一連の投稿を「個人攻撃」と認定するかは投稿者本人ではなく他人であることをご理解願います。 --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年9月10日 (金) 04:46 (UTC) :うーん,詳しいことはもう少し考えてから返答するけど,俺が思うに #まず,あなたの行動は完全に自由だからご自由にどうぞ。 #自分の行動については,全くってわけじゃあないけど,それほど後ろめたくない。むしろ180や高校生が今までの100倍後ろめたさ感じるべきだね。 #あと個人攻撃については…むしろ俺は狂ったサル山集団攻撃ってイメージ^^--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月10日 (金) 04:57 (UTC) :Tomzoさんが差し戻ししちゃったので,もう少しだけ書いておきますか…。私としてはむしろEvgremさんの措置で,厄介ごとから逃れられて助かるんですがね…。とはいってももうこの話はほんとにうんざりだなー。ほんとにめんどくさい連中にかかわってしまったようだね…。だから本論とは違うんだけど,しかし粘着っていうのは気持ち悪い言葉だね。なぜかあんたら京大関係者からこの言葉を聞くことが多いんだけど,何?学校ではやってるの?しかし多くの場合は悪行,不適切言論をし放題した奴が抗議されたときに,抗議した人をこう呼ぶシーンしか見たことがないんだけど…。だから超難関校,京大でございっていう割にはあんたらの発想って幼稚だよね。言葉に関しては既成の言葉自体の意味パワーに依存するだけ依存してるじゃん。もうちょっと言葉って何か考えてみろよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月10日 (金) 10:03 (UTC) では…このページの今後の建設的な発展のために少しは協力しますか…。果たしてうまく書けるかどうかはわかりませんが,このコメントを最後にこの項目は破棄して,新たな項目を作って議論すれば,このページの編集は今後も建設的に継続できると思います。 まあ皆さん私の発言は有害有害といいますが,まあ別に有害でもいいですが,アフリマン的な悪に対抗できるのは,ルシファー的な悪だけですよ。 まあ私の文章に関する善悪は考えないとして,この項目の中で問題があるのは,受験生氏と180氏の文章だけだと思っています。あとの方の文章はものすごく内容のある密度のある議論で,建設的だと思う。 とはいえこの項目自体長いし,密度も半端なく濃いので,しつこいようですが,ほとんど読んでいない,詳読はしていませんよ。 とりあえず私は180氏の本文文章は非常に問題があると思うけど,もはやすべて消されたのだろうし,180氏以前の状態に今は戻っているわけですよね。 だとしたら,全て仕切り直しでしょう。180氏の文章を修正するための議論はすべて白紙に戻ったのではないでしょうか? だとしたら,今後このページを発展させるためには,180氏以前の文章を基に,有志の方たちが編集を重ねていけばいいのではないでしょうか? まあお前が言うなってことでしょうが,私としてはこのくらいしか書けないですね。私自身は京大卒ではありませんが,大卒の時,大学院受験をするためにわざわざ京都に出向いて,まあ当時は情報の流通が今とはだいぶ違うので,そうすべきと判断したのですが,出願書を取り寄せたことがありますよ。ただ様々な事情で出願自体はしませんでしたがね。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年9月11日 (土) 07:55 (UTC) == 議論の進め方について == 出先で入力環境が悪いので簡潔に。 ノートページにおいては、議論の経過が不明になるため、無闇に除去しないでください。 自分の主張を取り下げる場合は、認め得ますが、それも打ち消し線による方が推奨されます。 他人の書き込みについては、その主張が、正しくない・的外れである・無関係であると考えるなら、その旨を主張して下さい。掲載に不適当な中傷等があれば、それは別途「不可視化」等で対応いたします。—--[[利用者:Tomzo|Tomzo]] ([[利用者・トーク:Tomzo|トーク]]) 2021年9月11日 (土) 00:17 (UTC) == リニューアル版のアンケート投稿スペース == こちらにご投稿ください。 [[特別:投稿記録/240A:6B:B10:BD65:84D0:7167:56C7:E1A9|240A:6B:B10:BD65:84D0:7167:56C7:E1A9]] 2021年10月29日 (金) 06:37 (UTC) 一応、京大出身で河合塾にて理系数学の指導歴あるから、自分が意見できるのは数学のみですが。 推薦書籍の掲載は不要だね。 これは消したのも妥当。 紹介する以上特定の予備校宣伝に抵触するんで、書けないが正しい。 年度別の大問難易評価も目安にはなるが各予備校、赤本、青本で評価も毎年バラバラだし統一できないんだから書かない方がいい。 wikiオリジナリル評価にしかならないし、ブログで書くなら別にいいがね。 んで、あと京大入試の採点方法や京大の部分点懐疑論は別に消す必要ないよ。 京大名誉教授の森毅が中公文庫から数学受験指南術っていう本出してて、その中に該当項目の記述あるわけだし。 出典明記できる箇所まで消すのはあかんが、前の版の本文長いからまあいちいち精査してられなかったんだろうけど。 議論読んだが全体的に雑だよ。 とても議論とは呼べない。 最近、ネットが流行ってから論破とかそういうしょうもない揚げ足取りのすったもんだで勝ち負け論にしたがる人らが増えたけど、止揚ってもんが下敷きに無いもんだからさ。 空中分解したの、みたいに解散?したのかな。 一人高校生相手に大人気ない対応してる人は問題外でかなり印象よろしくないけど、他の人たちも全体的に連携がとれてないでしょ、これ。 まああのまま残すのも問題があったわけだけど、出典明記をめんどくさがらずにやれば、半分以上は消さずに済んだよね、って感想。 [[利用者:Hvxv48nvzii3|Hvxv48nvzii3]] ([[利用者・トーク:Hvxv48nvzii3|トーク]]) 2021年11月3日 (水) 07:00 (UTC) :ハイハイ,偉い偉い。凄い凄い。賢い賢い。(^^)凸。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:06 (UTC) :↑↑じゃあお前のこの文章が大人の文章なの?馬鹿馬鹿しい,小学生だってもうちょっといい文章書くよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:24 (UTC) :解散も連携もなにも,みんな個人の資格で,あの狂った文章を何とかまともにしたかっただけ。集団の力学と,おかしな糞理屈しか頭にないお前が一番の糞--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:12 (UTC) :じゃあお前が凄いという議論ってどんなの?例を見せろよ(^^)凸--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:14 (UTC) :印象もなにも,Wikibooksも京大も,河合塾も大したもんじゃあないだろ?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:16 (UTC) :大体消さずに済んだっていうけど,書いたやつ自身が自分で消したんだからどうせーつうの?そんな偉そうなこと言うならお前がいい形に編集すればいいんじゃあねーの?だから,ここで話し合ってるうちに,書いてたやつがうんざりして消しちゃったんだよ,まあ俺のせいかもしれないけどね^^;;;。そもそもあいつの文章に,そんなに言ってかばう価値あるの?まあ俺はほとんど読んでないけど。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:33 (UTC) :そもそも論でいえばさー京大に合格することってそんな重要なことかね?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:35 (UTC) :そもそもさー,無料で読めるサイト,誰でも書き込めるサイトで,おかしな御託並べるなよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 09:58 (UTC) :それに今の文章が良くないみたいなこと言うけど,それもあんたらが絶賛する賢い男が自分で考えて自分で書いたんだよ?添削だの要請だの書いてるけど,それはあいつなりのジョークだと俺は思ってるけど。そもそもここで真面目に文章書いている人は,お互いにしめしあったり連絡とったりすることはほとんど,あるいはまったくないね。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 10:07 (UTC) :もうすでに重ね過ぎだけど………あなたももうアカウントを持ってるわけでしょ?そして京大卒河合塾で数学指導してた賢い人間なんでしょ?だったらさーここの過去履歴にあんたらが絶賛する素晴らしい文章がすべて残ってるわけだから,それを持ってきて切り張りして再編集して,ここであんたが宣った方針にまとめ上げて,up,上書きすればそれで済む話なんじゃあないの?それが妥当でいい内容だったら,誰一人文句なんて言わないよ。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月3日 (水) 12:17 (UTC) == では… == 本来は差し戻してから書くべきかもしれないね,スパゲティになっちゃうし,でもなんかこの上に書いたほうがいいような気もしてね,まず誹謗中傷だから消すってことだけど,そうねー,じゃあ高3受験生と,Hvxのも消せばって思うけど,でも誹謗中傷ではないかもね,うんざりするほど不愉快な文章ではあるけど…でもさー「一人高校生相手に大人気ない対応してる人は問題外で」ってのは結構誹謗中傷的じゃあない?大人げないは許せるけど問題外は腹立つね,これがなければもうちょっと柔らかい反応したかもしれない。しかしいまごろ,ツイッター界隈や現実の京大界隈では,馬鹿馬鹿しい奴らが醜い顔つき合わせて,まあまともな人はこんなこと大した興味ないだろうけど,インチキなおしゃべりがかんかんがくがくされてるのかね?俺はツイッター否定派でね,アカウントも持ってないし,基本ほとんど見ない。でも情報収集のため,あるいはある程度気に入っている方のため,ごくときどきはWebでみるよ。今回の180の京大対策の文章を面白がってた馬鹿馬鹿しい奴が多くいるのは知ってるし,最近見たのはここのページで,「後半,煽りたいだけの奴がいたな」なんてのも見たことがある。それ俺じゃん^^:::。しかし京大の学生ってさー煽りとか粘着とか,馬鹿馬鹿しい安易な言葉を得意げに振り回して物事分かった気になってる低能も結構多いんだね。もちろん,ちゃんとした知的な真面目な人もいっぱいいるだろうけど…。まあとにかくあんたら,自分が賢いと思い過ぎて傲慢になりきってるやつらではなしあって,何とかこのページまとめてみたら?俺についての言及がなければもお俺は関わらないよ。ほんとうんざり。あ,いやでも,あまりにもひどい書き込みがあれば,やはりなんか書いちゃうかもね。一応俺もWikibooksの参加者だからね。--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月4日 (木) 11:27 (UTC) == 議論の進め方について2 == [[#議論の進め方について|上]]に書いたとおりです。 議論に関係あるか否かの判断は、個人がすべきではありませんし、たとえそうであったとしても、その旨を指摘・主張すべきです。また、掲載に誹謗中傷を含めた不適当な表現等があれば、「除去」するのではなく、その旨(どの部分が、なぜ掲載するのに不適当なのか)を主張し、コミュニティの合意を得て「不可視化」すべきです(個人情報等に絡んだものについては緊急に対応することはあります)。 本文の内容にあまり関心がないので、以下、個人的意見ですが、この議論は論点が発散しているように思えます。本文について、何を、なぜ除去すべきか、又、残すべきかをポイントを列挙し、個々に議論することをお勧めします。その際の観点としては、まず、その記述が、誰かによって主張され、それが書籍等によって確認できるか(すなわち、「出典があるか」「独自の研究ではないか」)という観点がキーとなると考えます。 また、ここの記述については、ウィキペディアにおける「[[w:Wikipedia:礼儀を忘れない|礼儀を忘れない]]」「[[w:Wikipedia:エチケット|エチケット]]」を心がけていただくようお願いします。--[[利用者:Tomzo|Tomzo]] ([[利用者・トーク:Tomzo|トーク]]) 2021年11月4日 (木) 13:44 (UTC) == 自由発言スペース(議論の進め方への感想など) == お久しぶりです。 攻撃的な言葉を用いることをまずどうか控えてください。 上記投稿がありますので、中から抜粋しますと、「馬鹿馬鹿しい奴らが醜い顔つき合わせて」、「インチキなおしゃべりがかんかんがくがく」「馬鹿馬鹿しい安易な言葉を得意げに振り回して物事分かった気になってる低能」「自分が賢いと思い過ぎて傲慢になりきってるやつら」など、他に言い様があるように思います。 それらをここで書き残す必要性も含めて。 また先日の河合塾講師に向けた投稿内でも、10回も連続して投稿する必要がありましたか? 指を突き立てる絵文字などを含めて野蛮でしかありません。 --[[利用者:Evgrem2|Evgrem2]] ([[利用者・トーク:Evgrem2|トーク]]) 2021年11月4日 (木) 15:11 (UTC) :うーん,だからあんたら京大関係者は,一応は賢い知性のある人間たちなんだからさー。俺がここに前に書いた,「アフリマン的な悪に対抗できるのは,ルシファー的な悪だけ」という言葉の意味を考えてほしいんだよね。アフリマンとは何なのか?ルシファーとは,サタンとは何なのか?何故悪に対して正義では勝てず,悪をぶつけるしかないのか? :攻撃的な言葉控える,10回もいらないっていうけど,この手の悪徳には,この10倍辛らつな言葉をぶつけても,現実には蛙のつらにしょんべんだよ。 :Tomzoさんに対するあなたのコメントを読んでみると,「ツイッターなど他媒体のSNSで議論版での彼の発言が取り沙汰されているようで、」なんて書いてあって,いやー聞きたくない情報,ますますツイッターなんか見ないのが正解だね。 :だからやっぱりあなた方に聞きたいのは,[[w:アフリマン]]っていったい何だと思う? :それからTomzoさんのトークページの最新版見たけど,俺の発言があるから本題の議論しづらいというのは分かるけど,結局これは議事記録だからね。できるだけオリジナルはそのままにしないと…。だから俺の提案としては,俺という大馬鹿^^;;;の相手する項目と,本題のこのページの発展のための議論と二つ項目作ったら?だけど結局此の先混ざっちゃうと思うけど^^;;;。それはお前次第だろ?お前のせいだろって言われればその通りなんだけど^^;;;……。あっでもこの議論スペースが,俺の論点に関する項目だね。だからあなたが不愉快な内容消したいというのは分かるんだけど,やはり本題のための項目を新たに作って,今までの議論経過まとめて書いてから,スタートするといいと思うけど… :まあそれじゃあ俺の馬鹿話が気になって人が集まらないって言いたいんだろうけど…でもそれはどうしようもないなー。それだったらあんたがたこの話題に興味ある人たちが集まってむしろ,京大入試対策Wikiなんか作ったほうがいいんじゃあないの? :まあでもね,それは現実の受験業界と絡む話になるから,結構難しいかな? :なんか今急にエヴァンゲリオンのこと思い出したよ。♪残ー酷な天使のテーゼ,これって[[w:ルシファー]]のことなのかな?--[[利用者:Honooo|Honooo]] ([[利用者・トーク:Honooo|トーク]]) 2021年11月4日 (木) 20:17 (UTC) == 個人所有時計の全面禁止について == Wikibooksに限らず他のWebサイトやSNS,それどころか大手予備校の作成する実戦模試ですら周知されていない("本試では個人時計の利用が禁止されている"とアナウンスされる)のですが,令和8年度学部入試から時計機能に限ったアナログ時計に限って卓上に置くことが解禁されています. [https://www.kyoto-u.ac.jp/sites/default/files/inline-files/ippanbosyuyokoR8_all-52cb31b1c0bbdc1bcd0b0a9bb4c2e70f.pdf#page=38 令和8年度一般選抜要項 34ページ] --[[特別:投稿記録/~2026-57700-00|~2026-57700-00]] ([[利用者・トーク:~2026-57700-00|トーク]]) 2026年10月29日 (木) 19:06 (UTC) rmzgr9j3x8segwvz3fvobmde0lm9efc 論語/巻第二 八佾第三 0 17734 305190 302361 2026-10-30T08:11:06Z Tomzo 248 305190 wikitext text/x-wiki {{stub|論語}} #孔子謂季氏:「八佾舞於庭,是可忍也,孰不可忍也?」 #三家者以雍徹。子曰:「『相維辟公,天子穆穆』,奚取於三家之堂?」 #子曰:「人而不仁,如禮何?人而不仁,如樂何?」 #林放問禮之本。子曰:「大哉問!禮,與其奢也,寧儉;喪,與其易也,寧戚。」 #子曰:「夷狄之有君,不如諸夏之亡也。」 #季氏旅於泰山。子謂冉有曰:「女弗能救與?」對曰:「不能。」子曰:「嗚呼!曾謂泰山,不如林放乎?」 #子曰:「君子無所爭,必也射乎!揖讓而升,下而飲,其爭也君子。」 #子夏問曰:「『巧笑倩兮,美目盼兮,素以為絢兮。』何謂也?」子曰:「繪事後素。」曰:「禮後乎?」子曰:「起予者商也!始可與言詩已矣。」 #子曰:「夏禮,吾能言之,杞不足徵也;殷禮,吾能言之,宋不足徵也。文獻不足故也,足則吾能徵之矣。」 #子曰:「禘自既灌而往者,吾不欲觀之矣。」 #或問禘之說。子曰:「不知也。知其說者之於天下也,其如示諸斯乎!」指其掌。 #[[/第十二|第十二]] #:祭如在,祭神如神在。子曰:「吾不與祭,如不祭。」 #::祭ること在すが如くし、神を祭ること神在すが如くす。子曰く「吾祭に與らざれば,祭らざるが如し。」 #王孫賈問曰:「與其媚於奧,寧媚於竈,何謂也?」子曰:「不然,獲罪於天,無所禱也。」 #子曰:「周監於二代,郁郁乎文哉!吾從周。」 #子入大廟,每事問。或曰:「孰謂鄹人之子知禮乎?入大廟,每事問。」子聞之曰:「是禮也。」 #子曰:「射不主皮,為力不同科,古之道也。」 #子貢欲去告朔之餼羊。子曰:「賜也,爾愛其羊,我愛其禮。」 #子曰:「事君盡禮,人以為諂也。」 #定公問:「君使臣,臣事君,如之何?」孔子對曰:「君使臣以禮,臣事君以忠。」 #子曰:「關雎,樂而不淫,哀而不傷。」 #哀公問社於宰我。宰我對曰:「夏后氏以松,殷人以柏,周人以栗,曰使民戰栗。」子聞之曰:「成事不說,遂事不諫,既往不咎。」 #子曰:「管仲之器小哉!」或曰:「管仲儉乎?」曰:「管氏有三歸,官事不攝,焉得儉?」「然則管仲知禮乎?」曰:「邦君樹塞門,管氏亦樹塞門;邦君為兩君之好,有反坫,管氏亦有反坫。管氏而知禮,孰不知禮?」 #子語魯大師樂。曰:「樂其可知也:始作,翕如也;從之,純如也,皦如也,繹如也,以成。」 #儀封人請見。曰:「君子之至於斯也,吾未嘗不得見也。」從者見之。出曰:「二三子,何患於喪乎?天下之無道也久矣,天將以夫子為木鐸。」 #子謂韶,「盡美矣,又盡善也。」謂武,「盡美矣,未盡善也」。 #子曰:「居上不寬,為禮不敬,臨喪不哀,吾何以觀之哉?」 {{DEFAULTSORT:はちいつ}} [[Category:論語]] sosxhpvkqxkp1hecfnydvdeoffssjjt 機械語 0 26647 305173 299638 2026-10-30T00:21:55Z Ef3 694 '''機械語'''(きかいご、machine language)とは、コンピュータの中央処理装置(CPU)が直接解釈して実行できる'''命令の集合'''です。プロセッサのハードウェア仕様に基づいた'''固有のビットパターン(符号化された数値データ)'''として構成され、特定の基数による表現に縛られるものではありません。 305173 wikitext text/x-wiki '''機械語'''(きかいご、machine language)とは、コンピュータの中央処理装置(CPU)が直接解釈して実行できる'''命令の集合'''です。プロセッサのハードウェア仕様に基づいた'''固有のビットパターン(符号化された数値データ)'''として構成され、特定の基数による表現に縛られるものではありません。 == 主な特徴 == # '''CPU固有''' #* 機械語はCPUのアーキテクチャに依存しており、異なるCPU(例: x86、ARM)では異なる機械語が用いられます。 # '''直接実行可能''' #* 機械語は、中間的な翻訳や解釈を必要とせず、CPUがそのまま実行します。 # '''低水準言語''' #* 高水準言語(例: C、Python)とは異なり、機械語はハードウェアに近い抽象度の低い言語です。プログラミングには非常に細かい作業が必要です。 # '''命令セットアーキテクチャ(ISA)'''に基づく #* 機械語は、特定のCPUがサポートする'''命令セットアーキテクチャ'''(Instruction Set Architecture)に準拠しています。例えば、「データをロードする」「加算する」「分岐する」などの命令が含まれます。 == 機械語の例(x86-64アーキテクチャの場合) == 以下は、<code>add eax, 1</code>(EAXレジスタの値に1を加算する)の機械語表現です: * バイナリ: <code>00000001 11000000</code> * 16進数: <code>01 C0</code> == 機械語と関連する他の言語 == * '''アセンブリ言語''' *: 機械語に対して、'''人間が理解しやすい表現'''(ニーモニック)を使った低水準言語。アセンブリ言語をアセンブラで翻訳すると機械語になります。 *:* 例: <code>mov eax, 1</code> * '''高水準言語''' *: 機械語やアセンブリ言語よりも人間にとって理解しやすい言語。コンパイラやインタプリタによって、最終的に機械語に変換されます。 *:* 例: <code>x = x + 1</code>(C言語の場合) == 機械語の利点と欠点 == ; 利点 :* '''高速な実行''': 中間翻訳が不要なため、直接CPUで実行できます。 :* '''細かい制御''': ハードウェアの動作を詳細に制御できます。 ; 欠点 :* '''難解さ''': 人間には理解しにくく、プログラミングが非常に難しい。 :* '''非移植性''': CPU固有のため、異なるCPU間で互換性がありません。 == 機械語の使用例 == 現代では、プログラマーが直接機械語を書くことはほとんどありませんが、次のような場面で関わります: * 組み込みシステムの最適化 * OSのカーネルやドライバの設計 * セキュリティ関連の研究(例: バイナリ解析やリバースエンジニアリング) 以上が、機械語の基本的な説明です。興味があれば、具体的なCPUアーキテクチャ(例: x86-64、ARM)の命令セットを学ぶと、より深く理解できます。 == ソースコードからどんな機械語が生成されるか == ;フィボナッチ数を返す関数(C言語):<syntaxhighlight lang=c line copy> int fibo(int n) { if (n == 0 || n == 1) return n; return fibo(n-1) + fibo(n-2); } </syntaxhighlight> === 32bitARMプロセッサーの例 === ;コンパイラーによって生成されたコード:<syntaxhighlight lang=c-objdump line> $ clang-19 --target=arm -mfloat-abi=soft -c -Oz -g fibo.c $ llvm-objdump-19 --triple=arm -S fibo.o fibo.o: file format elf32-littlearm Disassembly of section .text: 00000000 <fibo>: ; int fibo(int n) { 0: e92d4830 push {r4, r5, r11, lr} 4: e28db008 add r11, sp, #8 8: e1a04000 mov r4, r0 c: e3a05000 mov r5, #0 ; if (n == 0 || n == 1) 10: e3540002 cmp r4, #2 ; } 14: 30840005 addlo r0, r4, r5 18: 38bd8830 poplo {r4, r5, r11, pc} ; return fibo(n-1) + fibo(n-2); 1c: e2440001 sub r0, r4, #1 20: ebfffffe bl 0x20 <fibo+0x20> @ imm = #-0x8 24: e0805005 add r5, r0, r5 28: e2444002 sub r4, r4, #2 2c: eafffff7 b 0x10 <fibo+0x10> @ imm = #-0x24 </syntaxhighlight> このコードは[[W:ARMアーキテクチャ#32ビットARM|32bitARMプロセッサ]]をターゲットとしたもので、すべての命令が32ビット長なのでアセンブラーの初学者向きです。 また、ARMアーキテクチャは多くのスマートフォンやタブレットで採用されていたり、組込み用途での採用も多いので最も普及しているコンピュータ・アーキテクチャの1つです。 ==== 各命令の説明 ==== 出力されたアセンブリの各行を詳細に見ていきます。 :<syntaxhighlight lang=c-objdump line start=10> 0: e92d4830 push {r4, r5, r11, lr} </syntaxhighlight> :* '''命令''': <code>push {r4, r5, r11, lr}</code> :* '''解説''': 関数のエントリポイントです。レジスタ<code>r4</code>, <code>r5</code>, <code>r11</code>, <code>lr</code>(リンクレジスタ)をスタックに保存して、<code>lr</code>は関数の復帰先アドレスを保持します。この命令によりスタックフレームが作成され、レジスタの内容が保存されます。 :<syntaxhighlight lang=c-objdump line start=11> 4: e28db008 add r11, sp, #8 </syntaxhighlight> :* '''命令''': <code>add r11, sp, #8</code> :* '''解説''': フレームポインタ<code>r11</code>を現在のスタックポインタにオフセットを追加した値に設定し、スタックフレームの開始位置を決めます。 :<syntaxhighlight lang=c-objdump line start=12> 8: e1a04000 mov r4, r0 </syntaxhighlight> :* '''命令''': <code>mov r4, r0</code> :* '''解説''': 引数<code>n</code>(<code>r0</code>に格納されている)をレジスタ<code>r4</code>に移動します。この<code>r4</code>が以降で引数<code>n</code>として使われます。 :<syntaxhighlight lang=c-objdump line start=13> c: e3a05000 mov r5, #0 </syntaxhighlight> :* '''命令''': <code>mov r5, #0</code> :* '''解説''': レジスタ<code>r5</code>に<code>0</code>を設定します。<code>r5</code>はこの後の計算結果の累積値を保持します。 :<syntaxhighlight lang=c-objdump line start=15> 10: e3540002 cmp r4, #2 </syntaxhighlight> :* '''命令''': <code>cmp r4, #2</code> :* '''解説''': <code>n < 2</code>を判定するため、<code>r4</code>と<code>2</code>を比較しています。 :<syntaxhighlight lang=c-objdump line start=17> 14: 30840005 addlo r0, r4, r5 18: 38bd8830 poplo {r4, r5, r11, pc} </syntaxhighlight> :* '''命令''': <code>addlo r0, r4, r5</code> :** '''解説''': <code>n</code>が<code>0</code>か<code>1</code>のとき、つまり<code>n < 2</code>の場合、<code>r0</code>に<code>r4</code>と<code>r5</code>の和を返します<ref>ARMアーキテクチャでは、多くの命令でキャリーなどのコンディションコードによって実行する・しないを制御できるのが大きな特徴で、他のアーキテクチャではジャンプ命令以外でコンディションコードによって実行する・しないを制御できるのは稀です(他にはIA-64がプレディケート可能です)。</ref>。 :* '''命令''': <code>poplo {r4, r5, r11, pc}</code> :** '''解説''': 条件が成立(<code>n < 2</code>)した場合、関数から復帰します。スタックからレジスタ<code>r4</code>, <code>r5</code>, <code>r11</code>, <code>pc</code>(プログラムカウンタ)を復元し、<code>pc</code>に復帰アドレスが入ることで呼び出し元に戻ります。 :<syntaxhighlight lang=c-objdump line start=20> 1c: e2440001 sub r0, r4, #1 20: ebfffffe bl 0x20 <fibo+0x20> </syntaxhighlight> :* '''命令''': <code>sub r0, r4, #1</code> :** '''解説''': <code>n-1</code>を計算し、再帰呼び出しのために<code>r0</code>にセットします。 :* '''命令''': <code>bl 0x20 <fibo+0x20></code> :** '''解説''': <code>fibo(n-1)</code>を再帰的に呼び出します。このとき、リンクレジスタ<code>lr</code>に次の命令アドレスが保存されます。 :<syntaxhighlight lang=c-objdump line start=22> 24: e0805005 add r5, r0, r5 </syntaxhighlight> :* '''命令''': <code>add r5, r0, r5</code> :* '''解説''': <code>fibo(n-1)</code>の戻り値が<code>r0</code>に格納されているため、それを累積値<code>r5</code>に加算します。 :<syntaxhighlight lang=c-objdump line start=23> 28: e2444002 sub r4, r4, #2 </syntaxhighlight> :* '''命令''': <code>sub r4, r4, #2</code> :* '''解説''': <code>n-2</code>を計算し、次の再帰呼び出しのために<code>r4</code>にセットします。 :<syntaxhighlight lang=c-objdump line start=24> 2c: eafffff7 b 0x10 <fibo+0x10> </syntaxhighlight> :* '''命令''': <code>b 0x10 <fibo+0x10></code> :* '''解説''': ラベル<code>0x10</code>(再帰処理の比較部分)に無条件分岐します。 ==== Thumb命令の例 ==== ARMプロセッサはThumbと呼ばれるコード効率の向上を意図した16ビット長の[[W:ARMアーキテクチャ#Thumb|Thumb命令モード]]を持っています。 ;コンパイラーによって生成されたコード:<syntaxhighlight lang=c-objdump line> $ clang-19 --target=thumb -mfloat-abi=soft -mthumb -c -Oz -g fibo.c $ llvm-objdump-19 --triple=thumb -S fibo.o fibo.o: file format elf32-littlearm Disassembly of section .text: 00000000 <fibo>: ; int fibo(int n) { 0: b5b0 push {r4, r5, r7, lr} 2: af02 add r7, sp, #0x8 4: 0004 movs r4, r0 6: 2500 movs r5, #0x0 ; if (n == 0 || n == 1) 8: 2c02 cmp r4, #0x2 a: d305 blo 0x18 <fibo+0x18> @ imm = #0xa ; return fibo(n-1) + fibo(n-2); c: 1e60 subs r0, r4, #0x1 e: f7ff fffe bl 0xe <fibo+0xe> @ imm = #-0x4 12: 1945 adds r5, r0, r5 14: 1ea4 subs r4, r4, #0x2 16: e7f7 b 0x8 <fibo+0x8> @ imm = #-0x12 ; } 18: 1960 adds r0, r4, r5 1a: bdb0 pop {r4, r5, r7, pc} </syntaxhighlight> ==== 各命令の説明 ==== 出力されたアセンブリの各行を詳細に見ていきます。 :<syntaxhighlight lang=c-objdump line start=8> 00000000 <fibo>: ; int fibo(int n) { 0: b5b0 push {r4, r5, r7, lr} </syntaxhighlight> :* '''命令 <code>push {r4, r5, r7, lr}</code>''': レジスタ <code>r4</code>、<code>r5</code>、<code>r7</code>、<code>lr</code> (リンクレジスタ) をスタックに保存し、再帰的な呼び出しでもレジスタの値を保持します。 :<syntaxhighlight lang=c-objdump line start=11> 2: af02 add r7, sp, #0x8 </syntaxhighlight> :* '''命令 <code>add r7, sp, #0x8</code>''': フレームポインタレジスタ <code>r7</code> をスタックポインタから8バイト分ずらして設定します。ローカル変数や引数へのアクセスを簡単にするために使用されます。 :<syntaxhighlight lang=c-objdump line start=12> 4: 0004 movs r4, r0 6: 2500 movs r5, #0x0 </syntaxhighlight> :* '''命令 <code>movs r4, r0</code>''': 引数 <code>n</code> をレジスタ <code>r4</code> に保存します。 :* '''命令 <code>movs r5, #0x0</code>''': レジスタ <code>r5</code> に0を設定します。これはフィボナッチ計算の一部で、計算結果を保存していくためのレジスタです。 :<syntaxhighlight lang=c-objdump line start=14> ; if (n == 0 || n == 1) 8: 2c02 cmp r4, #0x2 a: d305 blo 0x18 <fibo+0x18> </syntaxhighlight> :* '''命令 <code>cmp r4, #0x2</code>''': <code>n</code> の値 (<code>r4</code>) を2と比較します。 :* '''命令 <code>blo 0x18 <fibo+0x18></code>''': <code>n</code> が2未満(すなわち0か1)なら、条件分岐して0x18番地にジャンプします。ここで関数の終了処理に進みます。 :<syntaxhighlight lang=c-objdump line start=17> ; return fibo(n-1) + fibo(n-2); c: 1e60 subs r0, r4, #0x1 e: f7ff fffe bl 0xe <fibo+0xe> 12: 1945 adds r5, r0, r5 14: 1ea4 subs r4, r4, #0x2 16: e7f7 b 0x8 <fibo+0x8> </syntaxhighlight> :* '''命令 <code>subs r0, r4, #0x1</code>''': <code>r4</code> から1を引き、<code>fibo(n-1)</code> を計算するための引数を設定します。 :* '''命令 <code>bl 0xe <fibo+0xe></code>''': <code>fibo</code> 関数を再帰的に呼び出します。この再帰呼び出しは <code>fibo(n-1)</code> を求めます。 :* '''命令 <code>adds r5, r0, r5</code>''': 呼び出しの結果が <code>r0</code> に格納され、これを <code>r5</code> に加えます。 :* '''命令 <code>subs r4, r4, #0x2</code>''': <code>n</code> の値から2を引き、<code>fibo(n-2)</code> を求める準備をします。 :* '''命令 <code>b 0x8 <fibo+0x8></code>''': 再度 <code>fibo</code> 関数に戻ってループを繰り返し、 <code>fibo(n-1) + fibo(n-2)</code> を計算します。 :<syntaxhighlight lang=c-objdump line start=24> 18: 1960 adds r0, r4, r5 1a: bdb0 pop {r4, r5, r7, pc} </syntaxhighlight> :* '''命令 <code>adds r0, r4, r5</code>''': 最終的な結果を <code>r0</code> に格納し、戻り値として設定します。 :* '''命令 <code>pop {r4, r5, r7, pc}</code>''': スタックからレジスタの内容を復元し、関数の実行を終了します。 Thumb命令は概ね命令長は16ビットで、長いオペランドが必要な命令(この場合は bl)だけが追加のオペランドを持ちます。 === 64bitARMプロセッサーの例 === ARMアーキテクチャーは、ARMv8-Aから64ビットモードアーキテクチャーAArch64を採用してます。 AArch64は、32本の64ビットレジスター(うち1本はスタックポインター兼ゼロレジスタ、1本は戻り番地を保持するリンクレジスタ)を持ち、Xnnレジスターは64ビットレジスターのnn本目、WnnはXnnレジスターの下位32ビットです。 ;コンパイラーによって生成されたコード:<syntaxhighlight lang=c-objdump line> $ clang-19 --target=aarch64 -c -Oz -g fibo.c $ llvm-objdump-19 --triple=aarch64 -S fibo.o fibo.o: file format elf64-littleaarch64 Disassembly of section .text: 0000000000000000 <fibo>: ; int fibo(int n) { 0: a9be7bfd stp x29, x30, [sp, #-0x20]! 4: a9014ff4 stp x20, x19, [sp, #0x10] 8: 910003fd mov x29, sp c: 2a1f03f3 mov w19, wzr ; if (n == 0 || n == 1) 10: 71000814 subs w20, w0, #0x2 14: 540000e3 b.lo 0x30 <fibo+0x30> ; return fibo(n-1) + fibo(n-2); 18: 51000400 sub w0, w0, #0x1 1c: 94000000 bl 0x1c <fibo+0x1c> 20: 2a0003e8 mov w8, w0 24: 2a1403e0 mov w0, w20 28: 0b130113 add w19, w8, w19 2c: 17fffff9 b 0x10 <fibo+0x10> ; } 30: 0b130000 add w0, w0, w19 34: a9414ff4 ldp x20, x19, [sp, #0x10] 38: a8c27bfd ldp x29, x30, [sp], #0x20 3c: d65f03c0 ret </syntaxhighlight> このコードは、AArch64アーキテクチャ用にコンパイルされた再帰的なフィボナッチ関数 <code>fibo</code> のアセンブリリストです。以下で各部分を解説します。 :<syntaxhighlight lang=c-objdump line start=10> 0: a9be7bfd stp x29, x30, [sp, #-0x20]! 4: a9014ff4 stp x20, x19, [sp, #0x10] 8: 910003fd mov x29, sp c: 2a1f03f3 mov w19, wzr </syntaxhighlight> :* '''スタックフレームの設定''':<code>stp</code> 命令でリンクレジスタ (<code>x30</code>) とフレームポインタ (<code>x29</code>) をスタックに保存し、<code>sp</code>(スタックポインタ)を更新しています。また、<code>x20</code> と <code>x19</code> の値もスタックに保存しています。これにより、関数が呼び出されるたびにスタック上に新しいフレームが作成され、レジスタの状態が保持されます。 :* '''初期化''':<code>mov w19, wzr</code> によって、<code>w19</code> にゼロ (<code>wzr</code>はゼロレジスタ) を設定しています。これは <code>n = 0</code> または <code>n = 1</code> の場合の初期戻り値として使用されます。 :<syntaxhighlight lang=c-objdump line start=15> 10: 71000814 subs w20, w0, #0x2 14: 540000e3 b.lo 0x30 <fibo+0x30> </syntaxhighlight> :* '''条件チェック''':引数 <code>n</code>(<code>w0</code>に格納)を使って <code>n < 2</code> かどうかをチェックしています。<code>subs w20, w0, #0x2</code> によって、<code>n - 2</code> の結果が <code>w20</code> に格納され、<code>b.lo</code> 命令で <code>n < 2</code> の場合に <code>0x30</code> のラベルにジャンプします。これにより <code>n</code> が 0 または 1 の場合は直接 <code>n</code> を返す処理に移行します。 :<syntaxhighlight lang=c-objdump line start=18> 18: 51000400 sub w0, w0, #0x1 1c: 94000000 bl 0x1c <fibo+0x1c> 20: 2a0003e8 mov w8, w0 24: 2a1403e0 mov w0, w20 28: 0b130113 add w19, w8, w19 2c: 17fffff9 b 0x10 <fibo+0x10> </syntaxhighlight> :* '''再帰呼び出し''':<code>w0</code> を <code>n-1</code> として設定して <code>fibo(n-1)</code> を呼び出します。この結果が <code>w0</code> に返され、<code>mov w8, w0</code> で一時保存します。その後 <code>w0</code> に <code>n-2</code> を設定し、再度 <code>fibo(n-2)</code> を呼び出し、その結果を <code>w19</code> に加算します。<code>b 0x10</code> によってループに戻り、これを繰り返して <code>fibo</code> を計算します。 :<syntaxhighlight lang=c-objdump line start=25> 30: 0b130000 add w0, w0, w19 34: a9414ff4 ldp x20, x19, [sp, #0x10] 38: a8c27bfd ldp x29, x30, [sp], #0x20 3c: d65f03c0 ret </syntaxhighlight> :* '''結果を返す''':計算が完了したら、結果(<code>w0</code>)を返します。スタック上に保存していた <code>x20</code>、<code>x19</code>、<code>x29</code>、および <code>x30</code> を復元し、<code>ret</code> で関数から戻ります。 wzrはゼロレジスターを32bitで参照しています、spはスタックポインターでアドレス演算の文脈と左辺値の文脈ではスタックポインター、右辺値の場合はゼロレジスターになりレジスタインデックス(31番)を共有しています。 aarch64 では32bitARMと違って全ての命令に条件フラッグ参照が着くわけではないので、どちらかというと Thumb に似ていますが最小命令サイズは32bitです。 === amd64プロセッサーの例 === amd64(X86-64とも)の命令は最小単位は1バイトで、バイト数あたりの操作が多いのが特徴です。 逆アッセンブルされたコードを読む限り不便は感じませんが、ハンドディスアッセンブルする場合は1バイトずれるとまるで違った意味になるのが厄介で、プロセッサーの中でも数命令先の命令を読み込み実行効率を上げる為に命令の切れ目を探すことが性能向上のボトルネックになっています(ARMなら次の命令は4バイト先と決まっているので深い先読みが相対的に容易)。 ;同じコードをamd64向けにコンパイル:<syntaxhighlight lang=c-objdump line> $ clang-19 --target=amd64 -c -Oz -g fibo.c $ llvm-objdump-19 --triple=amd64 -S fibo.o fibo.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <fibo>: ; int fibo(int n) { 0: 55 pushq %rbp 1: 48 89 e5 movq %rsp, %rbp 4: 41 56 pushq %r14 6: 53 pushq %rbx 7: 89 fb movl %edi, %ebx 9: 45 31 f6 xorl %r14d, %r14d ; if (n == 0 || n == 1) c: 83 fb 02 cmpl $0x2, %ebx f: 72 10 jb 0x21 <fibo+0x21> ; return fibo(n-1) + fibo(n-2); 11: 8d 7b ff leal -0x1(%rbx), %edi 14: e8 00 00 00 00 callq 0x19 <fibo+0x19> 19: 41 01 c6 addl %eax, %r14d 1c: 83 c3 fe addl $-0x2, %ebx 1f: eb eb jmp 0xc <fibo+0xc> ; } 21: 44 01 f3 addl %r14d, %ebx 24: 89 d8 movl %ebx, %eax 26: 5b popq %rbx 27: 41 5e popq %r14 29: 5d popq %rbp 2a: c3 retq </syntaxhighlight> このアセンブリコードは、x86-64 アーキテクチャ用にコンパイルされた再帰的なフィボナッチ関数 <code>fibo</code> の内容を示しています。各命令が何をしているか解説します。 :<syntaxhighlight lang=c-objdump line start=10> 0: 55 pushq %rbp 1: 48 89 e5 movq %rsp, %rbp 4: 41 56 pushq %r14 6: 53 pushq %rbx 7: 89 fb movl %edi, %ebx 9: 45 31 f6 xorl %r14d, %r14d </syntaxhighlight> :* '''スタックフレームの設定''':<code>pushq %rbp</code> と <code>movq %rsp, %rbp</code> によってスタックフレームを設定しています。また、関数内で使用する <code>%r14</code> と <code>%rbx</code> レジスタをスタックに退避させ、関数終了時に復元できるようにしています。 :* '''引数の格納と初期化''':引数 <code>n</code> は <code>%edi</code> レジスタに格納されているため、これを <code>%ebx</code> に移しています(<code>movl %edi, %ebx</code>)。また、<code>%r14d</code> をゼロクリアして初期化しています。この <code>%r14</code> は、最終的な戻り値のための一時的な蓄積レジスタとして使用されます。 :<syntaxhighlight lang=c-objdump line start=17> c: 83 fb 02 cmpl $0x2, %ebx f: 72 10 jb 0x21 <fibo+0x21> </syntaxhighlight> :* '''条件チェック''':引数 <code>n</code> の値が 2 未満 (<code>n < 2</code>) かどうかを比較しています。<code>cmpl $0x2, %ebx</code> によって <code>%ebx</code>(<code>n</code> の値)と定数 <code>2</code> を比較し、<code>jb</code>(jump if below)命令によって <code>n < 2</code> の場合は、アドレス <code>0x21</code> にジャンプします。これは、フィボナッチ数列の初期条件に当たるケースです。 :<syntaxhighlight lang=c-objdump line start=20> 11: 8d 7b ff leal -0x1(%rbx), %edi 14: e8 00 00 00 00 callq 0x19 <fibo+0x19> 19: 41 01 c6 addl %eax, %r14d 1c: 83 c3 fe addl $-0x2, %ebx 1f: eb eb jmp 0xc <fibo+0xc> </syntaxhighlight> :* '''再帰呼び出し''': :** <code>leal -0x1(%rbx), %edi</code> によって、<code>%edi</code> に <code>n - 1</code> を設定し、<code>fibo(n-1)</code> を呼び出します。 :** <code>callq</code> 命令の後で <code>%eax</code> に返り値が格納されます。この <code>%eax</code> の値(<code>fibo(n-1)</code> の結果)を <code>%r14d</code> に加算して、合計を蓄積します。 :** 次に、<code>%ebx</code>(<code>n</code> の値)を <code>n - 2</code> に更新し、再び <code>jmp 0xc</code> によって <code>n - 2</code> での再帰を行い、計算が完了するまで繰り返します。 :<syntaxhighlight lang=c-objdump line start=26> 21: 44 01 f3 addl %r14d, %ebx 24: 89 d8 movl %ebx, %eax 26: 5b popq %rbx 27: 41 5e popq %r14 29: 5d popq %rbp 2a: c3 retq </syntaxhighlight> :* '''戻り値の設定と終了処理''':ここで蓄積していた <code>%r14d</code> を <code>%ebx</code> に加算し、最終的な戻り値を <code>%eax</code> に格納します。そして、保存しておいたレジスタ <code>%rbx</code>、<code>%r14</code>、<code>%rbp</code> を復元し、<code>retq</code> 命令で関数から戻ります。 このコードは再帰的なフィボナッチ関数を最適化していますが、各再帰呼び出しの後に部分的な結果を加算していくため、再帰が深くなるとスタックの使用量が増えます。このコードは、コンパイラの最適化オプション <code>-Oz</code> によりコードサイズが最小化されています。 ==== x86(32ビット)のコード ==== ;x86(32ビット)のコード:<syntaxhighlight lang=c-objdump line> $ clang-19 --target=i686 -c -Oz -g fibo.c $ llvm-objdump-19 --triple=i686 -S fibo.o fibo.o: file format elf32-i386 Disassembly of section .text: 00000000 <fibo>: ; int fibo(int n) { 0: 55 pushl %ebp 1: 89 e5 movl %esp, %ebp 3: 57 pushl %edi 4: 56 pushl %esi 5: 31 ff xorl %edi, %edi 7: 8b 75 08 movl 0x8(%ebp), %esi ; if (n == 0 || n == 1) a: 83 fe 02 cmpl $0x2, %esi d: 72 11 jb 0x20 <fibo+0x20> ; return fibo(n-1) + fibo(n-2); f: 8d 46 ff leal -0x1(%esi), %eax 12: 50 pushl %eax 13: e8 fc ff ff ff calll 0x14 <fibo+0x14> 18: 59 popl %ecx 19: 01 c7 addl %eax, %edi 1b: 83 c6 fe addl $-0x2, %esi 1e: eb ea jmp 0xa <fibo+0xa> ; } 20: 01 fe addl %edi, %esi 22: 89 f0 movl %esi, %eax 24: 5e popl %esi 25: 5f popl %edi 26: 5d popl %ebp 27: c3 retl </syntaxhighlight> このアセンブリコードは、i386(32ビット)アーキテクチャ用にコンパイルされた再帰的なフィボナッチ関数 <code>fibo</code> の内容を示しています。各命令が何をしているかを解説します。 :<syntaxhighlight lang=c-objdump line start=10> 0: 55 pushl %ebp 1: 89 e5 movl %esp, %ebp 3: 57 pushl %edi 4: 56 pushl %esi 5: 31 ff xorl %edi, %edi 7: 8b 75 08 movl 0x8(%ebp), %esi </syntaxhighlight> :* '''スタックフレームの設定''':<code>pushl %ebp</code> と <code>movl %esp, %ebp</code> で新しいスタックフレームを作成します。また、関数内で使用するレジスタ <code>%edi</code> と <code>%esi</code> をスタックに保存して、関数終了時に復元できるようにしています。 :* '''初期化''':<code>xorl %edi, %edi</code> によって <code>%edi</code> をゼロクリアしています。このレジスタは結果の一時的な蓄積に使われます。 :* '''引数の取得''':引数 <code>n</code> はスタックから取り出して <code>%esi</code> に格納しています(<code>movl 0x8(%ebp), %esi</code>)。これは、<code>fibo</code> 関数の引数 <code>n</code> です。 :<syntaxhighlight lang=c-objdump line start=17> a: 83 fe 02 cmpl $0x2, %esi d: 72 11 jb 0x20 <fibo+0x20> </syntaxhighlight> :* '''条件チェック''':<code>cmpl $0x2, %esi</code> で <code>%esi</code>(引数 <code>n</code>)と <code>2</code> を比較し、<code>jb</code>(jump if below)命令によって <code>n < 2</code> の場合にアドレス <code>0x20</code> にジャンプします。これは、フィボナッチ数列の初期条件をチェックする部分です。 :<syntaxhighlight lang=c-objdump line start=20> f: 8d 46 ff leal -0x1(%esi), %eax 12: 50 pushl %eax 13: e8 fc ff ff ff calll 0x14 <fibo+0x14> 18: 59 popl %ecx 19: 01 c7 addl %eax, %edi 1b: 83 c6 fe addl $-0x2, %esi 1e: eb ea jmp 0xa <fibo+0xa> </syntaxhighlight> :* '''再帰呼び出し''': :** <code>leal -0x1(%esi), %eax</code> によって、<code>%eax</code> に <code>n - 1</code> を設定し、次の再帰呼び出しの引数とします。 :** <code>pushl %eax</code> で引数をスタックにプッシュし、<code>calll</code> によって <code>fibo(n-1)</code> を再帰呼び出しします。 :** 呼び出しが終わったら <code>%eax</code> に戻り値が格納されます。これを <code>%edi</code> に加算して、合計を蓄積します。 :** <code>addl $-0x2, %esi</code> により <code>%esi</code> を <code>n - 2</code> に更新し、<code>jmp 0xa</code> で <code>n - 2</code> の場合の計算を再び行います。 :<syntaxhighlight lang=c-objdump line start=28> 20: 01 fe addl %edi, %esi 22: 89 f0 movl %esi, %eax 24: 5e popl %esi 25: 5f popl %edi 26: 5d popl %ebp 27: c3 retl </syntaxhighlight> :* '''戻り値の設定と終了処理''':最終的に <code>%edi</code>(<code>fibo(n-1)</code> の結果の蓄積)が <code>%esi</code> に加算され、戻り値として <code>%eax</code> に格納されます。スタックから <code>%esi</code>、<code>%edi</code>、<code>%ebp</code> を復元し、<code>retl</code> によって関数から戻ります。 このコードも再帰的なフィボナッチ関数を実装しています。再帰呼び出しでの部分的な計算結果が <code>%edi</code> に蓄積され、スタックの使用が少ないように最適化されています。 == まとめ == * 異なるプロセッサーでは、同じ高級言語のコードが全く違う機械語命令列にコンパイルされる。 * 同じプロセッサーでも命令モードによって、同じ高級言語のコードが全く違う機械語命令列にコンパイルされる。 * 再帰などのプログラム構造もコンパイラーによって(意味解析され)等価のより速度的に(あるいはメモリーフットプリント的に)優れたコードに置き換えられる(事がある)。 {{コラム|width=100%|機械語 = バイナリーデータ?|2=機械語はバイナリーデータですが、全てのバイナリーデータが機械語ではありません。 例えば、画像データや映像データはバイナリーデータですが機械語ではありません。 実行ファイルもバイナリーデータですが、オペレーティングシステムが「どの様に配置するのか?」「どの位置から実行するのか?」あるいは「初期化済みのデータ領域の値」など機械語以外の付帯的な情報(一般にメタ情報やデータセクションと呼ばれます)を複合的に持っているので、機械語を含んでいますが機械語そのものではありません。 機械語は、アセンブラのニーモニックに一対一で対応するコードと理解するとわかりやすいと思います。 }} == 用語集 == 機械語に関する用語集 * オペコード(Opcode) - 機械語命令の操作コード。特定の動作を実行するための識別子。 * オペランド(Operand) - オペコードによって指定された操作対象。演算の対象となる数値やアドレス。 * レジスタ(Register) - CPU内にある高速なメモリ領域で、演算に使用されるデータやアドレスを格納するために使用される。 * フラグ(Flag) - CPUの状態を示すビットで、演算の結果を表す。フラグは、CPU内部で条件分岐を行うために使用される。 * メモリアドレス(Memory Address) - メモリ内の特定の場所を示す番号。機械語のオペランドとして使用されることが多い。 * メモリマップドI/O(Memory-mapped I/O) - I/Oデバイスを制御するために、メモリアドレスを使用する方法。 * ファイルI/O(File I/O) - ディスクやネットワーク上のファイルを操作するために使用される命令。 * 命令ポインタ(Instruction Pointer) - CPUが次に実行する機械語命令のアドレスを示すレジスタ。 * サブルーチン(Subroutine) - 他の部分から呼び出される、独立した機械語のブロック。 * スタック(Stack) - プログラム内で一時的なデータを格納するためのメモリ領域。 * エンディアン(Endian) - データの並び順を示す方法。リトルエンディアンは、最下位バイトから順にデータを配置する方式。ビッグエンディアンは、最上位バイトから順にデータを配置する方式。 * マシンサイクル(Machine Cycle) - CPUが一つの命令を実行するために必要なサイクル数。 * 命令セット(Instruction Set) - 特定のCPUが実行できる機械語命令の集合。 * アセンブラ(Assembler) - アセンブリ言語を機械語に変換するプログラム。 * リンカ(Linker) - 複数のオブジェクトファイルを結合して、実行可能なプログラムを生成するプログラム。 * デバッガ(Debugger) - プログラムの実行中に、機械語命令やレジスタの値を監視し、プログラムの動作を解析するツール。 * トレース(Trace) - プログラムの実行中に、実行された命令やメモリアクセスなどの履歴を保存すること。 * ブレークポイント(Breakpoint) - プログラムの実行中に、特定の命令の実行を一時停止し、デバッグのために命令の内容やレジスタの値を確認するために使用されるポイント。 * クロスコンパイラ(Cross-compiler) - 特定のCPU向けに、異なるプラットフォームでコンパイルするためのコンパイラ。 * リバースエンジニアリング(Reverse Engineering) - プログラムやハードウェアの動作を解析して、仕様や設計図を作成するプロセス。 * コンパイル(Compile) - 高水準言語で書かれたプログラムを、機械語に変換するプロセス。 * リンク(Link) - コンパイルされた複数のオブジェクトファイルを、実行可能なプログラムに結合するプロセス。 * アセンブル(Assemble) - アセンブリ言語で書かれたプログラムを、機械語に変換するプロセス。 * ローダ(Loader) - プログラムをメモリに読み込み、実行可能な状態にするプログラム。 * バイトコード(Bytecode) - 実行環境に依存しない、仮想マシン上で実行される機械語。 * オーバーフロー(Overflow) - データ型の最大値を超える演算が行われた場合に発生する、予期しない結果のこと。 * セグメンテーション違反(Segmentation Fault) - プログラムがメモリの範囲外をアクセスしようとした場合に発生するエラー。 * プロセス(Process) - プログラムの実行中に割り当てられる、メモリやレジスタ、実行状態などのリソースの集合。 * マルチプロセッシング(Multiprocessing) - 複数のプロセッサを使用して、プログラムを並列に処理する方式。 == 脚註 == <references/> [[Category:機械語|*]] [[Category:プログラミング言語]] 893xcdi0h5b5opo5xjp27lmalkxirph Go 0 28505 305172 305087 2026-10-30T00:09:43Z Ef3 694 /* Go 1.27 */ Go 1.27が、2026年8月にリリースされました。 Go 1.27のリリースでは、コンパイラの静的解析および最適化パイプラインの深化、SSAオプティマイザの拡張、およびプラットフォーム要件の近代化が含まれています。 305172 wikitext text/x-wiki {{Pathnav|メインページ|工学|情報技術|プログラミング}} [[Go]]は、Googleが開発したオープンソースの汎用プログラミング言語であり、特にバックエンドサービスやネットワークプログラミングを主な目的として設計されています<ref name="Introduction">{{cite book | url = https://go.dev/ref/spec#Introduction | title = The Go Programming Language Specification Language version go1.23 (June 13, 2024) | chapter = Introduction¶ | date = June 13, 2024 | publisher = The Go website }}</ref>。 静的型付け言語であるため、高速で効率的なプログラムを作成することができます。また、並行処理を簡単に実装できるgoroutineという仕組みを持ち、高い並行性を実現しています。 Goの文法はシンプルで読みやすく、効率的にコーディングできるため、開発者は迅速に新しいコードを書くことができます。ガベージコレクションによって自動的にメモリを管理するため、メモリ管理に関する手間を減らすことができます。 さらに、Windows、macOS、Linuxなど、多くのプラットフォームで動作し、標準ライブラリが豊富です。多くの外部ライブラリも存在するため、広範な用途に対応することができます。 Goのコミュニティは活発であり、多くの開発者が参加しています。質問や問題解決のためのリソースが豊富であり、新しい機能やライブラリが定期的にリリースされています。 この教科書では、初めてGoを学ぶ人から、より高度なトピックに興味のある人まで、幅広い読者を対象に、Goの基本から応用までを網羅的に解説します。 __TOC__ == 目次 == ;チュートリアル篇 : [[/環境構築|環境構築]] : [[/実行の方法|実行の方法]] {{---}} [[Go/実行の方法#Hello, World|Hello, World]] : [[/文法の概要|文法の概要]] : [[/変数|変数と型変換]] : [[/算術演算と数学関数|算術演算と数学関数]] : [[/条件分岐と繰り返し|条件分岐と繰り返し]] {{---}} if, switch, select, for, break, continue, return : [[/関数|関数]] : [[/メソッドとインターフェース|メソッドとインターフェース]] : [[/ジェネリクス|ジェネリクス]] : [[/再帰的関数呼出し|再帰的関数呼出し]] : [[/メソッドチェイン|メソッドチェイン]] : [[/defer,panicとrecover|defer, panicとrecover]] : [[/並行処理|並行処理]] : [[/配列とスライス|配列型とスライス型]] : [[/マップ|マップ型]] : [[/構造体|構造体型と構造体スライス]] : [[/イテレータ|イテレータ]] : [[/Goのプログラムがどんなアセンブリにコンパイルされるか?|Goのプログラムがどんなアセンブリにコンパイルされるか?]] {{---}} go tool objdump : [[/クロスコンパイル|クロスコンパイル]] {{---}} GOOS, GOARCH : [[/cgoでGoのコードからCの関数を利用する|cgoでGoのコードからCの関数を利用する]] {{---}} cgo : [[/Goのコードでgoのバージョンを調べる方法|Goのコードでgoのバージョンを調べる方法]] : [[/HTTP|HTTP]] : [[/ファイル入出力|ファイル入出力]] : [[/コードギャラリー|コードギャラリー]] ;リファレンス篇 : [[/ソースコードの表現方法|ソースコードの表現方法]] : [[/キーワードと宣言済み識別子|キーワードと宣言済み識別子]] {{---}} [[/キーワードと宣言済み識別子#キーワード|キーワード]]・[[/キーワードと宣言済み識別子#宣言済み識別子|宣言済み識別子]]([[/キーワードと宣言済み識別子#組込み型|組込み型]]・[[/キーワードと宣言済み識別子#組込み関数|組込み関数]]) : [[/字句的要素|字句的要素]] : [[/定数と変数|定数と変数]] {{---}} [[/定数と変数#定数|定数]]([[/定数と変数#iota|iota]])・[[/定数と変数#変数|変数]] : [[/型|型]] : [[/型と値の特性|型と値の特性]] : [[/ブロック・宣言とスコープ|ブロック・宣言とスコープ]] {{---}} [[/ブロック・宣言とスコープ#ブロック|ブロック]]・[[/ブロック・宣言とスコープ#宣言とスコープ|宣言とスコープ]] : [[/式|式]] {{---}} [[/式#演算子|演算子]] : [[/文|文]] : [[/パッケージ|パッケージ]] : [[/プログラムの初期化と実行|プログラムの初期化と実行]] : [[/エラー|エラー]] : [[/EBNF|EBNF]] ;[[/標準ライブラリー|標準ライブラリー篇]] ;[[/改廃された技術|改廃された技術]] == バージョン間の変更点 == Go は、約半年ごとに新しいバージョンがリリースされます。バージョンが変わると、言語仕様に追加変更があったり、ツールチェーン、ランタイム、およびライブラリの実装に変更が加えられることがあり、稀に既存のプログラムに影響が出ることもあります。以下に、最新のバージョンから順に変更点を記載します。 === Go 1.27 === Go 1.27が、2026年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.27 | title = Go 1.27 Release Notes - The Go Programming Language | date = 2026/08/10 | accessdate = 2026/08/11 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.27 | title = Go 1.27 is released! - The Go Programming Language | date = 2026/08/10 | accessdate = 2026/08/11 }}</ref>。 Go 1.27のリリースでは、言語仕様へのジェネリックメソッドの導入、ツールチェーンの大幅な刷新、新しい標準パッケージの追加、およびランタイムと標準ライブラリのパフォーマンス改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.27 Go 1.27 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.27 Go 1.27 is released! The Go Blog]}} ; 言語の変更点: :# ジェネリックメソッドのサポート:メソッド宣言自体で独自の型パラメータを定義できるようになりました。これにより、パッケージ全体ではなく特定のデータ型の名前空間内でジェネリック関数を追加できるようになっています(例: math/rand/v2 の (*Rand) N メソッド)。 :# 構造体リテラルのフィールドセレクタ拡張:構造体リテラルのキーとして、トップレベルのフィールド名だけでなく、埋め込み構造体などの有効なフィールドセレクタを使用できるようになりました。 :# 関数型推論の一般化:ジェネリック関数が変数への代入や変換が行われるすべてのコンテキストで機能型推論が適用されるようになりました。 ; 新しい標準パッケージ: :# encoding/json/v2 および encoding/json/jsontext:設定可能なオプションやより厳格なデフォルトを備えた JSON 処理のメジャーリビジョンと、低レベルの構文処理パッケージ。 :# crypto/mldsa:ポスト量子暗号の署名スキーム(FIPS 204)を実装。 :# uuid:UUID の生成およびパースをネイティブでサポート。 ; 実験的新機能: :# simd および simd/archsimd:SIMD 命令へのアクセスを提供する実験的パッケージ。 ; ランタイムとパフォーマンスの改善: :# 高速なメモリアロケーション:サイズ特化したメモリアロケーションルーチンの生成により、80バイト未満の小さなオブジェクトの割り当てコストが最大 30% 削減されました。 :# ゴリーチンリークプロファイル:runtime/pprof における goroutineleak プロファイルタイプが一般提供され、永久にブロックされたゴリーチンの自動検出が可能になりました。 ; ツールの改善: :# go fix の現代化(Modernizers)拡充:atomictypes、embedlit、slicesbackward、unsafefuncs などの新しい modernizers が追加されました。 :# go mod tidy のブロック整理:go 1.27 以降を指定するモジュールにおいて、複数の require ブロックが直接依存と間接依存の標準的な2つのブロックに自動的に統合されるようになりました。 :# go doc の拡張:package@version 構文や -ex オプションによる実行例の表示をサポートしました。 ; 標準ライブラリの改善: :# encoding/json:新しい v2 実装を基盤とするようになり、後方互換性を維持しながらアンマーシャル処理が大幅に高速化されました。 :# net/http/httptest:testing/synctest パッケージでの使用に適したインメモリの偽ネットワークを提供する NewTestServer が追加されました。 ; プラットフォームサポートの変更: :# bzr(Bazaar)のサポート削除:go コマンドによる bzr バージョン管理システムの直接フェッチサポートが削除されました。 :# macOS リンク時の変更:macOS 向けビルドにおいて、リンカが -macos および -macsdk コマンドラインオプションを受け付けるようになり、デフォルトの最小サポートバージョンが 13.0.0 に設定されるようになりました。 Go 1.27では、言語仕様へのジェネリックメソッドの追加、標準ライブラリの次世代化(v2)、および開発効率・性能の向上に重点が置かれています。 === Go 1.25 === Go 1.25が、2025年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.25 | title = Go 1.25 Release Notes - The Go Programming Language | date = 2025/08/12 | accessdate = 2025/09/27 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.25 | title = Go 1.25 is released! - The Go Programming Language | date = 2025/08/12 | accessdate = 2025/09/27 }}</ref>。 Go 1.25のリリースでは、実験的機能を含む多くの重要な改良が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.25 Go 1.25 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.25 Go 1.25 is released! The Go Blog]}} ; 言語の変更点: :# 言語仕様上の変更はありませんが、言語仕様書からcore typesの概念が削除され、専用の記述に置き換えられました。これによりより正確で理解しやすい仕様書となっています。 ; 新しい標準パッケージ: :# testing/synctest:並行コードのテストをサポートするパッケージ。仮想化されたクロック機能により、並行プログラムのテストがより効率的に行えるようになりました。Go 1.24では実験的機能(GOEXPERIMENT=synctest)でしたが、Go 1.25で正式にサポートされました。 ; 実験的新機能: :# 新しい実験的ガベージコレクター:GOEXPERIMENT=greenteagcで有効化可能。小さなオブジェクトのマークとスキャンのパフォーマンスが大幅に改善され、実世界のプログラムでガベージコレクションのオーバーヘッドが10-40%削減される見込みです。 :# encoding/json/v2パッケージ:GOEXPERIMENT=jsonv2で有効化可能。既存のencoding/jsonパッケージの大幅な改良版で、特にデコード性能が大幅に向上しています。 ; ランタイムの改善: :# コンテナ対応のGOMAXPROCS:LinuxでcgroupのCPU帯域幅制限を考慮し、論理CPU数よりも制限が低い場合はGOMAXPROCSを制限値に設定します。また、全OSでGOMAXPROCSを動的に更新する機能が追加されました。 :# トレースフライトレコーダー:runtime/trace.FlightRecorderAPIにより、インメモリリングバッファを使用した軽量な実行トレースキャプチャが可能になりました。 :# VMAアノテーション:Linux上でメモリマッピングに目的を示すアノテーション([anon: Go: heap]など)が付加されるようになりました。 ; コンパイラの改善: :# nilポインターチェックのバグ修正:Go 1.21で導入された、nilポインターチェックが不適切に遅延される問題が修正されました。 :# DWARF5サポート:デバッグ情報でDWARF5が使用され、バイナリサイズの削減とリンク時間の短縮を実現しました。 :# スライスの高速化:より多くの状況でスライスのバッキングストアをスタックに割り当てることが可能になり、パフォーマンスが向上しました。 ; ツールの改善: :# go buildのLeakDetection:-asanオプションでプログラム終了時にメモリリーク検出がデフォルトで有効になりました。 :# go.modのignoreディレクティブ:go commandが無視すべきディレクトリを指定できるようになりました。 :# go docの-httpオプション:ドキュメントサーバーを起動しブラウザで表示する機能が追加されました。 :# go version -m -json:バイナリファイルの BuildInfo構造体をJSON形式で出力できるようになりました。 :# 新しいvetアナライザー:waitgroup(WaitGroup.Addの誤用を検出)、hostport(IPv6で動作しないアドレス構築パターンを検出)が追加されました。 ; 標準ライブラリの改善: :# crypto系パッケージでMessageSignerインターフェースが追加され、メッセージ自身をハッシュ化するサイナーをサポート。 :# crypto/sha1でSHA-NIインストラクションによる2倍の高速化。 :# crypto/sha3でApple Mプロセッサーでの2倍の高速化とCloner実装。 :# crypto/tlsでConnectionState.CurveIDフィールドとGetEncryptedClientHelloKeysコールバックを追加。 :# net/httpでCrossOriginProtectionによるCSRF保護機能が追加。 :# os/WindowsでのNewFileがFILE''FLAG''OVERLAPPEDハンドルに対応し、非同期I/Oをサポート。 :# sync.WaitGroup.Goメソッドによりgoroutineの作成とカウントパターンが簡便化。 :# testing系パッケージでT.Attr、B.Attr、F.Attrメソッドによるテスト属性出力をサポート。 ; セキュリティの改善: :# FIPS 140-3モードでの改善:crypto/ecdsaとcrypto/ed25519での署名処理が4倍高速化。 :# TLS 1.2でSHA-1署名アルゴリズムがデフォルトで無効化({{RFC|9155}}準拠)。 :# crypto/x509でCreateCertificateがSHA-256を使用したSubjectKeyId生成を使用。 ; プラットフォームサポートの変更: :# macOS:macOS 12 Monterey以降が必要になりました(Go 1.24の予告通り)。 :# Windows:32-bit ARM(windows/arm)ポートはGo 1.25が最後のサポートバージョンとなり、Go 1.26で削除予定です。 :# linux/loong64:レースディテクターとCgoトレースバック、内部リンクモードでのcgoプログラムリンクに対応。 :# linux/riscv64:pluginビルドモードに対応。GORISCV64環境変数でrva23u64値をサポート。 Go 1.25では、パフォーマンス、セキュリティ、開発者体験の向上に重点が置かれ、特に実験的機能として提供される新しいガベージコレクターやJSON実装により、将来的なさらなるパフォーマンス向上の基盤が築かれています。 === Go 1.24 === Go 1.24が、2025年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.24 | title = Go 1.24 Release Notes - The Go Programming Language | date = 2025/02/11 | accessdate = 2025/02/23 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.24 | title = Go 1.24 is released! - The Go Programming Language | date = 2025/02/11 | accessdate = 2025/02/23 }}</ref>。 Go 1.24のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.24 Go 1.24 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.24 Go 1.24 is released! The Go Blog]}} ; 言語の変更点: :# ジェネリック型エイリアスが完全にサポートされるようになりました。これにより、型エイリアスに型パラメータを設定できるようになり、既存の型を制約付きで再定義することが可能になりました。たとえば <code>type VectorAlias[T any] = Vector[T]</code> のような定義ができます。この機能は Go 1.23 では実験的な機能(GOEXPERIMENT=aliastypeparams)でしたが、Go 1.24で正式にサポートされました。 ; 新しい標準パッケージ: :# crypto/mlkem:ML-KEM-768とML-KEM-1024を実装したパッケージ。 :# crypto/hkdf:HMAC-based Extract-and-Expand key derivation function (HKDF) を実装したパッケージ。 :# crypto/pbkdf2:password-based key derivation function (PBKDF2) を実装したパッケージ。 :# crypto/sha3:SHA-3ハッシュ関数とSHAKE/cSHAKE extendable-output functionsを実装したパッケージ。 :# weak:弱参照を提供するパッケージ。 :# testing/synctest:並行コードのテストをサポートする実験的なパッケージ(GOEXPERIMENT=synctestが必要)。 ; パフォーマンスの改善点: :# Swiss Tablesベースの新しいマップ実装により、2-3%のCPUオーバーヘッドが削減。 :# 小さなオブジェクトのメモリ割り当ての効率化。 :# 新しいランタイム内部ミューテックス実装。 ; ツールの改善: :# go.modファイルでツール依存関係を追跡できるようになりました。 :# go buildとgo installに -json フラグが追加され、構造化されたJSON出力が可能に。 :# go vetに新しいtestsアナライザーが追加され、テストの一般的な間違いを検出可能に。 ; セキュリティの改善: :# FIPS 140-3コンプライアンスのための新しいメカニズムが追加。 :# TLSサーバーがEncrypted Client Hello (ECH)をサポート。 :# RSAキーは1024ビット未満のキーサイズでエラーを返すように変更。 ; プラットフォームサポートの変更: :# Linuxはカーネルバージョン3.2以降が必要になりました。 :# Go 1.24はmacOS 11 Big Surをサポートする最後のバージョンとなります。 :# Windows 32-bit ARM (windows/arm)は「broken」とマークされました。 また、1.23でサポートされた"for-range"ループのイテレータ機能を活用し、bytes/stringsパッケージに新しいイテレータ関数(Lines、SplitSeq、SplitAfterSeq、FieldsSeq、FieldsFuncSeq)が追加されました。os.Root型による特定ディレクトリ内でのファイルシステム操作が可能になり、testing.B.Loopメソッドにより、ベンチマークの記述がより簡単で安全になっています。 === Go 1.23 === Go 1.23が、2024年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.23 | title = Go 1.23 Release Notes - The Go Programming Language | date = 2024/08/13 | accessdate = 2024/11/13 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.23 | title = Go 1.23 is released! - The Go Programming Language | date = 2024/08/13 | accessdate = 2024/11/13 }}</ref>。 Go 1.23のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.23 Go 1.23 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.23 Go 1.23 is released! The Go Blog]}} ; 言語の変更点: :# "for-range" ループでイテレータ関数がサポートされるようになりました。これにより、カスタムイテレーション値を生成する関数を使用できます。 :# ジェネリック型エイリアスのプレビューサポートが追加されました(GOEXPERIMENT=aliastypeparamsを有効にする必要があります)。 ; 新しい標準パッケージ: :# uniqueパッケージ:値の正規化(インターン化やハッシュコンス化)を行うための機能を提供します。 :# iterパッケージ:ユーザー定義のイテレータ機能を提供します。 :# structsパッケージ:構造体のメモリレイアウトなどのプロパティを制御する機能を提供します。 ; パフォーマンスの改善点: :# Profile Guided Optimization (PGO)のビルドオーバーヘッドが大幅に削減されました。以前は100%以上の増加が見られましたが、今回のリリースでは一桁台のパーセンテージまで改善されています。 :# コンパイラがローカル変数のスタックフレームスロットを最適化し、関数内の異なる領域で重複して使用できるようになり、スタック使用量が削減されました。 ; テレメトリーと開発者ツール: :# Goツールチェーンが使用状況と問題点の統計情報を収集できるテレメトリー機能が追加されました(オプトイン方式)。 :# go vetコマンドにstdversionアナライザーが追加され、使用しているGoバージョンと互換性のないシンボルの参照を検出できるようになりました。 ; プラットフォームサポートの変更: :# macOSは11 (Big Sur)以降が必要になりました。 :# Linux kernelは2.6.32以降が必要です(Go 1.24では3.2以降になる予定)。 :# OpenBSDの64-bit RISC-Vサポートが試験的に追加されました。 また、time.TimerとTime.Tickerの実装が大幅に改善され、未使用のタイマーがガベージコレクションの対象となるようになりました。セキュリティ面では、TLSクライアントがEncrypted Client Helloをサポートし、3DESの暗号スイートがデフォルトリストから削除されるなどの改善が行われています。 === Go 1.22 === Go 1.22が、2024年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.22 | title = Go 1.22 Release Notes - The Go Programming Language | date = 2024/02/06 | accessdate = 2024/02/11 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.22 | title = Go 1.22 is released! - The Go Programming Language | date = 2024/02/06 | accessdate = 2024/02/11 }}</ref>。 Go 1.22のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.22 Go 1.22 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.22 Go 1.22 is released! The Go Blog]}} ; 言語の変更点: :# 長らく問題視されてきた「for」ループの変数スコープが変更されました。以前は変数が一度だけ作成され、各イテレーションで更新されていましたが、Go 1.22以降は各イテレーションで新しい変数が作成されるようになり、意図しない共有の問題が解消されました。 :# 整数の範囲に対する<code>range</code>のサポートが追加されました。例えば、<code>for i := range 10</code>のような構文が可能になりました。 ; パフォーマンスの改善点: :# ガベージコレクションのメタデータを各ヒープオブジェクトの近くに配置するように最適化されました。これにより、CPUパフォーマンスが1-3%向上し、ほとんどのGoプログラムのメモリオーバーヘッドが約1%削減されました。 :# コンパイラのプロファイル誘導最適化(PGO)が改善され、より多くのインターフェースメソッド呼び出しの仮想化解除が可能になりました。代表的なGoプログラムの多くで、PGOを有効にすることで2-14%のパフォーマンス向上が見られます。 :# コンパイラは仮想化解除とインライン化を交互に行うようになり、インターフェースメソッド呼び出しの最適化が向上しました。 ; 標準ライブラリの追加と改善: :# 標準ライブラリで初めてのv2パッケージとなる<code>math/rand/v2</code>が追加されました。新しいパッケージでは、ChaCha8とPCGという2つの現代的な疑似乱数生成器を提供し、より高速なアルゴリズムを採用しています。 :# <code>net/http.ServeMux</code>のHTTPルーティングがより表現力豊かになりました。メソッドとワイルドカードをサポートし、例えば"POST /items/create"や"/items/{id}"のようなパターンが使用可能になりました。 :# <code>database/sql</code>パッケージに<code>Null[T]</code>型が追加され、任意の型のnullableカラムをスキャンする機能が提供されます。 :# <code>go/version</code>パッケージが追加され、Goバージョン文字列の検証と比較機能が提供されます。 :# <code>slices</code>パッケージに複数のスライスを連結する<code>Concat</code>関数が追加されました。 ; ツールの改善: :# Goコマンドでワークスペースのvendorディレクトリがサポートされるようになりました。<code>go work vendor</code>でディレクトリを作成し、<code>-mod=vendor</code>フラグで使用できます。 :# トレースツールのWebUIが改良され、スレッド指向のビューでトレースを探索できるようになりました。また、すべてのシステムコールの完全な実行時間が表示されるようになりました。 :# <code>go vet</code>ツールに新しい警告が追加され、appendに値を渡し忘れた場合や、time.Since呼び出しの遅延に関する問題を検出できるようになりました。 また、macOSのx86-64アーキテクチャ(darwin/amd64)向けのGoツールチェーンが、デフォルトで位置独立実行形式(PIE)を生成するようになりました。Go 1.23以降はmacOS 11 Big Sur以降が必要になることも発表されています。 === Go 1.21 === Go 1.21が、2023年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.21 | title = Go 1.21 Release Notes - The Go Programming Language | date = 2023/08/08 | accessdate = 2023-11-28 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.21 | title = Go 1.21 is released! - The Go Programming Language 5| date = 2023/08/08 | accessdate = 2023-11-28 }}</ref>。 {{Main|[https://go.dev/doc/go1.21 Go 1.21 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.21 Go 1.21 is released! The Go Blog]}} Go 1.21では、リリースの番号付けにわずかな変更が導入されました。Go 1.Nは、過去にGo言語のバージョン全体とリリースファミリー、およびそのファミリー内の最初のリリースを指すために使用されていました。しかし、Go 1.21から、最初のリリースはGo 1.N.0となりました。今日、Go 1.21言語とその初期実装であるGo 1.21.0リリースが公開されています。これらのノートは「Go 1.21」と呼ばれますが、go versionなどのツールは「go1.21.0」と報告されます(Go 1.21.1にアップグレードするまで)。 ; ツールの改善点: :# Profile Guided Optimization(PGO)機能が一般利用可能になりました。<code>default.pgo</code>という名前のファイルがメインパッケージのディレクトリにある場合、<code>go</code>コマンドはそれを使用してPGOビルドを有効にします。 :# <code>go</code>ツールは今後の言語の後方互換性と前方互換性をサポートします。 ; 言語の変更点: :# 新しい組み込み関数 <code>min</code>、<code>max</code>、<code>clear</code> が追加されました。 :# ジェネリック関数の型推論がいくつか改善され、仕様書の型推論の説明が拡張されました。 :# Goプログラミングの最も一般的な落とし穴の1つに取り組む予定で、そのプレビューがGo 1.21に含まれています。これは環境変数を使用してコードで有効にできます。詳細はLoopvarExperiment wikiページを参照してください。 ;標準ライブラリの追加点: :# 構造化ログのための新しいlog/slogパッケージが追加されました。 :# 任意の要素型のスライスに対する共通操作のための新しいslicesパッケージが追加されました。これには、一般的により高速で使いやすいソート関数も含まれています。 :# 任意のキーまたは要素型のマップに対する共通操作のための新しいmapsパッケージが追加されました。 :# 順序付けられた値を比較するための新しいユーティリティを提供するcmpパッケージが追加されました。 ; 性能の改善点: :# PGOを有効にした際のパフォーマンス向上に加えて、以下のような改善があります。 :# Goコンパイラ自体がPGOを有効にして再ビルドされ、ホストアーキテクチャによってはプログラムのビルドが2〜4%高速化されました。 :# ガベージコレクターの調整により、一部のアプリケーションではテールレイテンシーが最大40%削減される場合があります。 :# runtime/traceでトレースを収集する際のCPUコストが、amd64およびarm64で大幅に低減されました。 ; 新しいWASIポート: :# Go 1.21には、WebAssembly System Interface(WASI)の実験的なポートが追加されました(GOOS=wasip1、GOARCH=wasm)。 :# より一般的なWebAssembly(Wasm)コードの記述を容易にするために、コンパイラはWasmホストからの関数のインポートのための新しい指令 <code>go:wasmimport</code> をサポートしています。 === Go 1.20 === Go 1.20が、2023年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.20 | title = Go 1.20 Release Notes - The Go Programming Language | date = 2023/02/01 | accessdate = 2023-03-05 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.20 | title = Go 1.20 is released! - The Go Programming Language | date = 2023/02/01 | accessdate = 2023-03-05 }}</ref>。 {{Main|[https://go.dev/doc/go1.20 Go 1.20 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.20 Go 1.20 is released! The Go Blog]}} Go 1.20では、スライスから配列への変換が可能になりました。また、unsafeパッケージには新しい関数が追加され、スライスや文字列の値を構築および分解する完全な機能が提供されるようになりました。また、新しい仕様により、構造体のフィールドと配列の要素の比較が最初の不一致で停止するようになり、厳密に比較できない型引数を持つ型パラメータを使用して、比較制約に制限された型をインスタンス化することが可能になりました。 === Go 1.19 === Go 1.19が、2022年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.19 | title = Go 1.19 Release Notes - The Go Programming Language | date = 2022/08/02 | accessdate = 2022-08-04 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.19 | title = Go 1.19 is released! - The Go Programming Language | date = 2022/08/02 | accessdate = 2022-08-04 }}</ref>。 {{Main|[https://go.dev/doc/go1.19 Go 1.19 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.19 Go 1.19 is released! The Go Blog]}} Go 1.19では、ツールチェーン、ランタイム、およびライブラリの実装に変更が加えられています。言語にはわずかな修正があり、既存のプログラムには影響がないです。メモリモデルも更新され、C、C ++、Java、JavaScript、Rust、Swiftなどのメモリモデルに合わせられた。Go 1.19では、sync/atomicパッケージに新しい型が導入され、atomic.Int64やatomic.Pointer[T]などのatomic値をより簡単に使用できるようになっています。Go 1の互換性を維持しており、ほとんどのGoプログラムは引き続き従前どおりにコンパイルおよび実行されることが予想されます。 === Go 1.18 === Go 1.18が、2022年3月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.18 | title = Go 1.18 Release Notes - The Go Programming Language | date = 2022/03/10 | accessdate = 2022-08-04 }}</ref>。 {{Main|[https://go.dev/doc/go1.18 Go 1.18 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.18 Go 1.18 is released! The Go Blog]}} Go 1.18 には、型パラメータプロポーザル<ref>{{cite book | url=https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md | title=Type Parameters Proposal | accessdate=2021-09-30 }}</ref>で説明されたジェネリック機能の実装が含まれています。 以下は、最も目に付く変更点のリストです。 # 関数と型宣言の構文に型パラメータが使えるようになりました。⇒ [[/関数#ジェネリック関数]] # パラメータ化された関数や型は、その後に角括弧で型引数のリストを記述することでインスタンス化することができます。 # 新しいトークン <code>~</code> が演算子および区切子(punctuation)に追加されました。⇒ [[/字句的要素#演算子と区切子]] # インターフェイス型の構文では、任意の型(インターフェイスの型名だけでなく)、unionや~T型要素を埋め込むことができるようになりました。このようなインターフェースは、型制約としてのみ使用することができます。インターフェイスはメソッドと同様に型の集合を定義するようになりました。⇒ [[/型#インターフェース型]] # 新しい事前宣言された識別子<code>any</code>は空のインターフェースの別名です。これは <code>interface{} </code>の代わりに使用することができます。 # 新しい宣言済み識別子 <code>comparable</code> は <code>==</code> や <code>!=</code> を使って比較できる全ての型の集合を表すインターフェースです. ジェネリックを使った実験的なパッケージが3つあり、便利かもしれません。これらのパッケージは x/exp リポジトリにあります。これらのパッケージの API は Go 1 の保証の対象外であり、ジェネリックの経験を積むにつれて変更される可能性があります。 ;golang.org/x/exp/constraints :<code>constraints.Ordered</code>のようなジェネリックコードに便利な制約です。 ;golang.org/x/exp/slices :任意の要素タイプのスライス上で操作するジェネリック関数のコレクションです。 ;golang.org/x/exp/maps :任意のキーや要素タイプのマップ上で操作するジェネリック関数のコレクションです。 ---- Go 1.18は、言語、ツールチェーン、ランタイム、ライブラリに変更があり、互換性が保たれている。最大の変更点は、ジェネリックスの導入である。ジェネリックスはバックワード互換性があるが、実際に多くの人が書き、使用して初めて本番環境で十分にテストされる。ジェネリックスの使用は推奨されるが、本番環境で使用する場合は注意が必要である。ジェネリックスにはいくつかの制限があるが、これらは将来的に改善される可能性がある。これらの変更により、Goエコシステム全体に影響があり、完全なサポートには時間がかかるだろう。 === Go 1.17 === Go 1.17が、2021年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.17 | title = Go 1.17 Release Notes - The Go Programming Language | date = 2021/08/16 | accessdate = 2023-03-06 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.17 | title = Go 1.17 is released! - The Go Programming Language | date = 2021/08/16 | accessdate = 2023-03-06 }}</ref>。 {{Main|[https://go.dev/doc/go1.17 Go 1.17 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.17 Go 1.17 is released! The Go Blog]}} Go 1.17は、ツールチェーン、ランタイム、およびライブラリの実装の変更が中心で、ほとんどの変更は互換性が維持されています。言語自体には3つの小さな強化があり、スライスから配列ポインタへの変換、unsafe.Add、unsafe.Sliceが追加されました。このうち、スライスから配列ポインタへの変換が実行時にpanicを引き起こす場合があるため、タイプ変換が実行時にpanicを引き起こす可能性があることを考慮する必要があります。新しいプログラムを書く場合も、以前と同様に、unsafe.Pointerの安全ルールに従う必要があります。 === Go 1.16 === Go 1.16が、2021年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.16 | title = Go 1.16 Release Notes - The Go Programming Language | date = 2021/02/16 | accessdate = 2023-03-06 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.16 | title = Go 1.16 is released! - The Go Programming Language | date = 2021/02/16 | accessdate = 2023-03-06 }}</ref>。 {{Main|[https://go.dev/doc/go1.16 Go 1.16 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.16 Go 1.16 is released! The Go Blog]}} Go 1.16では、ツールチェーン、ランタイム、ライブラリの実装が変更されています。Go 1の互換性を維持しながら、ほとんどのプログラムが従来通りにコンパイルおよび実行できるようになっています。言語には変更はありません。 === Go 1.15 === Go 1.15が、2020年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.15 | title = Go 1.15 Release Notes - The Go Programming Language | date = 2020/08/11 | accessdate = 2023-03-12 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.15 | title = Go 1.15 is released! - The Go Programming Language | date = 2020/08/11 | accessdate = 2023-03-12 }}</ref>。 {{Main|[https://go.dev/doc/go1.15 Go 1.15 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.15 Go 1.15 is released! The Go Blog]}} Go 1.15では、リンカーの大幅な改良、高いコア数での小規模オブジェクトの割り当ての改善、X.509 CommonNameの非推奨化、そして新しい埋め込みtzdataパッケージの追加が含まれています。 === Go 1.14 === Go 1.14が、2020年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.14 | title = Go 1.14 Release Notes - The Go Programming Language | date = 2020/02/25 | accessdate = 2023-03-12 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.14 | title = Go 1.14 is released! - The Go Programming Language | date = 2020/02/25 | accessdate = 2023-03-12 }}</ref>。 {{Main|[https://go.dev/doc/go1.14 Go 1.14 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.14 Go 1.14 is released! The Go Blog]}} Go 1.14では、オーバーラップするインターフェースの提案により、埋め込まれたインターフェースで同じ名前とシグネチャを持つメソッドを許可するようになりました。しかし、インターフェース内で宣言されたメソッドは以前と同様にユニークである必要があります。 === Go 1.13 === Go 1.13が、2019年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.13 | title = Go 1.13 Release Notes - The Go Programming Language | date = 2019/09/03 | accessdate = 2023-03-12 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.13 | title = Go 1.13 is released! - The Go Programming Language | date = 2019/09/03 | accessdate = 2023-03-12 }}</ref>。 {{Main|[https://go.dev/doc/go1.13 Go 1.13 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.13 Go 1.13 is released! The Go Blog]}} Go 1.13では、数字リテラルの接頭辞が変更され、バイナリ整数、8進数整数、16進数浮動小数点数、虚数リテラル、数字区切りが使用できるようになりました。さらに、符号付きシフトカウントの制限が撤廃され、制限がなくなりました。これらの変更は、コンパイラの変更によって実現されました。Go 1.13を使用するには、go.modファイルで言語バージョンを指定する必要があります。 === Go 1.12 === Go 1.12が、2019年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.12 | title = Go 1.12 Release Notes - The Go Programming Language | date = 2019/02/25 | accessdate = 2024/11/13 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.12 | title = Go 1.12 is released! - The Go Programming Language | date = 2019/02/25 | accessdate = 2024/11/13 }}</ref>。 Go 1.12のリリースには、いくつかの新機能と改善が含まれ、Go言語のパフォーマンスやユーザビリティがさらに向上しました。以下が主な変更点です。 {{Main|[https://go.dev/doc/go1.12 Go 1.12 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.12 Go 1.12 is released! The Go Blog]}} ; 主要な新機能: :# Windows向けに、標準ライブラリがコントロールグループのサポートやシステムコールの改善により、性能向上と安定性が強化されました。 :# macOS向けの新しいサポートとして、ヒープメモリ使用量の削減や効率化が進められました。 ; パフォーマンスの改善点: :# 文字列操作の最適化が行われ、<code>strings.Trim</code>や<code>strings.Index</code>のパフォーマンスが向上しました。 :# 並列ガベージコレクションが改良され、メモリ管理の効率が向上しています。 :# コンパイラの境界チェックが一部のパターンで自動的に省略されるようになり、コード生成の効率がさらに向上しました。 ; デバッグ機能の改善: :# より正確な変数位置とスタック情報の提供により、デバッグ体験が改善されています。 :# 新たにDWARF生成の機能が拡充され、特に最適化コードにおいて、デバッグ情報の信頼性が高まりました。 ; ランタイムの改善: :# Windows上で、64ビットプロセスのアドレス空間使用が最適化され、より多くのメモリを使用可能になりました。 :# Goランタイムのシグナルハンドリングが強化され、システムシグナルの処理能力が向上しました。 ; 標準ライブラリの改善: :# <code>crypto/x509</code>パッケージで、証明書の検証がmacOSのシステム証明書ストアを使用するようになり、macOSでの信頼性が向上しました。 :# <code>net/http</code>において、HTTP/2の接続管理が改善され、特に大量接続環境での安定性が増しました。 :# <code>os</code>パッケージの<code>Process.Signal</code>がWindowsでも利用可能となり、Windows上のプロセス管理機能が強化されました。 ; ツールの改善: :# <code>go test</code>コマンドに<code>-json</code>フラグが追加され、テスト結果をJSON形式で出力できるようになりました。 :# goコマンドが<code>go.sum</code>ファイルを自動的に更新し、依存関係の信頼性が向上しています。 :# <code>gofmt</code>において、特定のコードパターンの整形が改良され、より一貫したコードスタイルが保たれます。 また、OpenBSD 6.4以降、macOS 10.11 El Capitan以降、またはWindows 7以降が必要となり、これらのOSの以前のバージョンのサポートが終了しました。リリースノートでは、Go 1の互換性は維持されており、ほとんどのGoプログラムは以前と同様に動作すると述べられています。 === Go 1.11 === Go 1.11が、2018年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.11 | title = Go 1.11 Release Notes - The Go Programming Language | date = 2018/08/24 | accessdate = 2024/11/13 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.11 | title = Go 1.11 is released! - The Go Programming Language | date = 2018/08/24 | accessdate = 2024/11/13 }}</ref>。 Go 1.11のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.11 Go 1.11 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.11 Go 1.11 is released! The Go Blog]}} ; 主要な新機能: :# モジュールサポートの実験的な導入により、GOPATHに依存しない開発が可能になりました。バージョン管理と依存関係管理が統合され、より信頼性の高いビルドが実現できます。 :# WebAssembly(js/wasm)の実験的なポートが追加され、syscall/jsパッケージを通じてJavaScriptとの連携が可能になりました。 :# RISCVアーキテクチャ向けのGOARCH値("riscv"と"riscv64")が予約されました。 ; パフォーマンスの改善点: :# マップのクリア操作が最適化され、<code>for k := range m { delete(m, k) }</code>のようなコードが効率的に実行されるようになりました。 :# スライス拡張の<code>append(s, make([]T, n)...)</code>が最適化されました。 :# コンパイラの境界チェックと分岐除去が大幅に改善され、より効率的なコードが生成されるようになりました。 ; デバッグ機能の改善: :# 最適化されたバイナリのデバッグ情報が大幅に改善され、変数位置情報、行番号、ブレークポイント位置がより正確になりました。 :# DWARFセクションがデフォルトで圧縮されるようになりました。 :# デバッガー内からのGo関数呼び出しが実験的にサポートされました。 ; ランタイムの改善: :# スパースヒープレイアウトの採用により、Goヒープサイズの制限(従来は512GiB)が撤廃されました。 :# macOSとiOSで、カーネルの直接呼び出しの代わりにlibSystem.dylibを使用するように変更され、将来のOSバージョンとの互換性が向上しました。 ; 標準ライブラリの改善: :# <code>crypto/cipher</code>パッケージに、非標準のタグ長をサポートするGCM実装が追加されました。 :# <code>net/http</code>の<code>Transport</code>型に、ホストごとの最大接続数を制限する<code>MaxConnsPerHost</code>オプションが追加されました。 :# <code>os</code>パッケージに、ユーザー固有のキャッシュディレクトリを取得する<code>UserCacheDir</code>関数が追加されました。 ; ツールの改善: :# 環境変数<code>GOFLAGS</code>が導入され、goコマンドのデフォルトフラグを設定できるようになりました。 :# godocのWebサーバーが、APIの新機能がどのGoバージョンで導入されたかを表示するようになりました。 また、OpenBSD 6.2以降、macOS 10.10 Yosemite以降、またはWindows 7以降が必要となり、これらのOSの以前のバージョンのサポートが終了しました。リリースノートでは、Go 1の互換性は維持されており、ほとんどのGoプログラムは以前と同様に動作すると述べられています。 ---- === Go 1.10 === Go 1.10が、2018年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.10 | title = Go 1.10 Release Notes - The Go Programming Language | date = 2018/02/16 | accessdate = 2025/05/20 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.10 | title = Go 1.10 is released - The Go Programming Language | date = 2018/02/16 | accessdate = 2025/05/20 }}</ref>。 Go 1.10のリリースでは、開発体験を大幅に向上させる複数の重要な改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.10 Go 1.10 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.10 Go 1.10 is released! The Go Blog]}} ; ビルドシステムの大幅改善: :# ビルドキャッシュの導入により、最近ビルドしたパッケージが自動的にキャッシュされ、ビルド時間が大幅に短縮されました。 :# テスト結果のキャッシュ化により、変更のないテストは再実行せずにキャッシュされた結果を使用するようになりました。 :# <code>go test</code>時に<code>go vet</code>が自動実行され、テスト前にコードの問題を検出できるようになりました。 :# <code>go install</code>コマンドが、コマンドラインで指定されたパッケージのみをインストールするように変更されました。 ; cgoのセキュリティ強化と機能拡張: :# cgoの<code>#cgo CFLAGS</code>などで指定できるコンパイラオプションが安全なもののみに制限され、<code>-fplugin</code>などの危険なオプションは使用できなくなりました。 :# Go文字列値へのC言語からの直接アクセスが可能になり、<code>_GoString_</code>型、<code>_GoStringLen</code>、<code>_GoStringPtr</code>関数が追加されました。 :# CのtypedefがGoの型エイリアスとして実装され、<code>C.X</code>と<code>C.Y</code>を相互に使用できるようになりました。 ; パフォーマンスの改善点: :# ガベージコレクタが割り当て遅延への影響を軽減するよう改善されました。 :# コンパイラの最適化によりコード生成品質が向上し、サポートされている全アーキテクチャで性能が向上しました。 :# スタックトレースから暗黙のラッパー関数(<code><autogenerated></code>マーク)が除外され、より読みやすくなりました。 ; ツールの改善: :# <code>go doc</code>コマンドが、型Tを返すスライスや*Tを返す関数も型Tの表示に含めるようになりました。 :# <code>go test</code>に<code>-failfast</code>フラグが追加され、テスト失敗時に残りのテストを停止できるようになりました。 :# <code>go test -json</code>フラグが追加され、機械読み取り可能なJSON形式でテスト結果を出力できるようになりました。 :# <code>go get</code>コマンドでFossilソースコードリポジトリがサポートされました。 ; ランタイムの改善: :# <code>LockOSThread</code>と<code>UnlockOSThread</code>の呼び出しがネストをサポートするようになりました。 :# <code>GOMAXPROCS</code>の制限が撤廃されました(以前は1024が上限)。 :# <code>GOROOT</code>関数が、環境変数が設定されていない場合にプログラムのコンパイル時の値を使用するようになりました。 ; 標準ライブラリの改善: :# <code>strings</code>パッケージに新しい<code>Builder</code>型が追加され、文字列構築時のメモリ効率が向上しました。 :# <code>math</code>パッケージに<code>Round</code>、<code>RoundToEven</code>、<code>Erfinv</code>、<code>Erfcinv</code>関数が追加されました。 :# <code>net/url</code>の<code>ResolveReference</code>が複数の先頭スラッシュを保持するように修正され、{{RFC|3986}}に準拠しました。 :# <code>bytes</code>パッケージの<code>Fields</code>、<code>Split</code>系関数が、返すサブスライスの容量を長さと同じに設定するようになり、メモリ効率が向上しました。 :# <code>archive/tar</code>と<code>archive/zip</code>でより多くのヘッダー形式や時刻エンコーディングがサポートされました。 ; デバッグ機能の改善: :# バイナリ内のDWARFデバッグ情報が改善され、定数値の記録、より正確な行番号情報、パッケージ単位でのコンパイル単位の表現が実現されました。 :# 各種ビルドモードがより多くのシステムに対応し、<code>c-shared</code>、<code>pie</code>、<code>plugin</code>モードの対応プラットフォームが拡張されました。 ; アセンブラの拡張: :# ARM 32ビット、ARM 64ビット、PowerPC 64ビット、S390X、X86 64ビットアーキテクチャで多数の新しい命令がサポートされました。 :# 特にX86 64ビットでは、AVX、AVX2、BMI、BMI2、F16C、FMA3、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2などの拡張命令セットを含む359の新命令が追加されました。 ; ソースコードフォーマットの変更: :# <code>gofmt</code>のデフォルトフォーマットに軽微な変更があり、3つのインデックスを持つスライス式と単一行のインターフェースリテラルの表示が改善されました。 === Go 1.9 === Go 1.9が、2017年8月にリリースされました<ref>{{cite web | url = https://go.dev/doc/go1.9 | title = Go 1.9 Release Notes - The Go Programming Language | accessdate = 2025-05-20 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.9 | title = Go 1.9 is released - The Go Blog | date = 2017/08/24 | accessdate = 2025-05-20 }}</ref>。 Go 1.9のリリースでは、言語、ツール、ランタイム、標準ライブラリに多くの変更と改善が含まれています。主な変更点は以下の通りです。 {{Main|[https://go.dev/doc/go1.9 Go 1.9 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.9 Go 1.9 is released - The Go Blog]}} ; 言語の変更点: :# 型エイリアス: パッケージ間で型を移動する際などに、段階的なコードの修正をサポートするための型エイリアスが導入されました。 :#:<code>type T1 = T2</code> :#:の形式で宣言することで、既存の型 T2 に別の名前 T1 を与えることができます。 :# 浮動小数点演算の融合: 言語仕様が更新され、実装が浮動小数点演算(例えば、積和演算)を融合することが許可される条件が定義されました。中間結果の丸めを強制したい場合は、float64(x*y) + z のように明示的な型変換が必要です。 ; 新しい標準パッケージ: :# math/bits: 符号なし整数のビット操作(カウント、操作など)のための最適化された実装を提供する新しいパッケージが追加されました。可能な場合、CPUの特殊な命令が利用されます。 ; パフォーマンスの改善点: :# 並列コンパイル: パッケージ内の関数のコンパイルが並列化され、マルチコア環境でのビルド時間が改善されました。この機能はデフォルトで有効ですが、環境変数 GO19CONCURRENTCOMPILATION=0 を設定することで無効にできます。 :# ガベージコレクション: ストップザワールド型のガベージコレクションを引き起こしていたライブラリ関数 (runtime.GC, debug.SetGCPercent, debug.FreeOSMemory) が、呼び出し元のゴルーチンのみをブロックする並行ガベージコレクションに変更されました。 ; ツールの改善: :# Vendorディレクトリのマッチング: go test などのパッケージ名を引数に取るツールにおいて、./... が vendor ディレクトリ内のパッケージをマッチしなくなりました。vendor ディレクトリをマッチさせるには、./vendor/.... を使用する必要があります。 :# GOROOTの移動: go tool は、実行されたパスからGoのインストールツリーのルートを特定するようになりました。これにより、Goのインストールディレクトリ全体を移動した場合でも、go tool が通常通り動作するはずです。 :# go test -list: テスト、ベンチマーク、またはExampleの名前を正規表現でフィルタリングしてリスト表示する -list フラグが go test コマンドに追加されました。 :# go env -json: 環境変数をJSON形式で出力する -json フラグが go env コマンドに追加されました。 ; その他の注目すべき変更点: :# sync.Map: 並行アクセスに対応した新しいマップ型 sync.Map が追加されました。読み込み、書き込み、削除操作は償却定数時間で行われます。 :# testing.Helper: testing.T および testing.B に Helper メソッドが追加されました。このメソッドを呼び出すと、エラー報告などでファイル名と行番号が表示される際に、ヘルパー関数自身ではなく、ヘルパー関数を呼び出した箇所の情報が表示されるようになります。 :# timeパッケージ: time パッケージは、各 Time 値に透過的に単調時間(monotonic time)を追跡するようになり、壁時計の調整があっても二つの Time 値間の経過時間を安全に計算できるようになりました。 :# runtime.CallersFrames: インライン化されたフレームを含むコールスタックの情報を正確に取得するために、runtime.Callers の結果を直接検査するのではなく、runtime.CallersFrames を使用することが推奨されるようになりました。 :# runtime/pprof: runtime/pprof パッケージで生成されるプロファイルにシンボル情報が含まれるようになり、プロファイルを生成したバイナリなしで go tool pprof で表示できるようになりました。また、プロファイルレコードにラベルを追加する機能も追加されました。 Go 1.9には、上記以外にも多くの追加、改善、および修正が含まれています。詳細については、公式のリリースノートを参照してください。 === Go 1.8 === Go 1.8が、2017年2月にリリースされました<ref>{{cite web | url = https://go.dev/doc/go1.8 | title = Go 1.8 Release Notes - The Go Programming Language | accessdate = 2025-05-20 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.8 | title = Go 1.8 is released - The Go Blog | date = 2017/02/16 | accessdate = 2025-05-20 }}</ref>。 Go 1.8のリリースでは、ツールチェーン、ランタイム、およびライブラリの実装に多くの変更が含まれています。主な変更点は以下の通りです。 {{Main|[https://go.dev/doc/go1.8 Go 1.8 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.8 Go 1.8 is released - The Go Blog]}} ; 言語の変更点: :# '''構造体型の変換:''' Go 1.8以降、構造体間の明示的な型変換において、タグが無視されるようになりました。タグのみが異なる2つの構造体は、相互に変換可能です。 :# '''浮動小数点定数の指数:''' 言語仕様が更新され、実装が浮動小数点定数で最大16ビットの指数をサポートすることが要求されるようになりました。ただし、"gc" と gccgo コンパイラは、どちらも32ビットの指数をサポートしています。 ; ポート: :# '''32-bit MIPSのサポート:''' Linux上で、big-endian (linux/mips) と little-endian (linux/mipsle) の両方のマシンで、FPUまたはカーネルFPUエミュレーションを備えたMIPS32r1命令セットを実装する32-bit MIPSがサポートされるようになりました。 ; ツール: :# '''アセンブラ:''' 64-bit x86システム用に、VBROADCASTSD, BROADCASTSS, MOVDDUP, MOVSHDUP, MOVSLDUP, VMOVDDUP, VMOVSHDUP, VMOVSLDUPなどの命令が追加されました。 :# '''Yacc:''' yaccツールは削除されました。 :# '''Fix:''' fixツールに、"golang.org/x/net/context" から "context" へimportを変更する "context" fixが追加されました。 :# '''Pprof:''' pprofツールは、"https+insecure" URLスキームを使用して、TLSサーバーをプロファイルし、証明書の検証をスキップできるようになりました。 :# '''Trace:''' traceツールに、実行トレースからpprof互換のブロッキングおよびレイテンシプロファイルを生成するための -pprof フラグが追加されました。 :# '''Vet:''' Vetは、いくつかの点でより厳密になり、以前に誤検出を引き起こしていた箇所ではより緩くなりました。 ; コンパイラツールチェーン: :# '''SSAバックエンド:''' 64-bit x86システム用の新しいコンパイラバックエンドが導入されました。このバックエンドは、よりコンパクトで効率的なコードを生成し、境界チェックの排除などの最適化のためのより良いプラットフォームを提供します。 :# '''コンパイラとリンカの最適化:''' コンパイラとリンカが最適化され、Go 1.7よりも高速に実行されるようになりました。 ; Cgo: :# Goツールは、make.bash中に設定されたCGO_ENABLED環境変数の値を記憶し、デフォルトですべての将来のコンパイルに適用するようになりました。 ; デフォルトのGOPATH: :# GOPATH環境変数が設定されていない場合、デフォルト値を持つようになりました。Unixでは$HOME/go、Windowsでは%USERPROFILE%/goがデフォルトです。 ; Go get: :# "go get"コマンドは、-insecureフラグが使用されているかどうかに関係なく、HTTPプロキシ環境変数を常に尊重するようになりました。 ; Go bug: :# 新しい "go bug" コマンドは、現在のシステムに関する情報が事前に入力された状態で、GitHubでバグレポートを開始します。 ; Go doc: :# "go doc" コマンドは、godocの動作に従い、定数と変数をその型でグループ化するようになりました。 ; プラグイン: :# Goは、Goで記述されたプラグインを生成するための "plugin" ビルドモードと、実行時にそのようなプラグインをロードするための新しい plugin パッケージによる、プラグインの初期サポートを提供するようになりました。 ; ランタイム: :# '''引数の活性:''' ガベージコレクタは、関数全体の引数をライブとは見なしなくなりました。 :# '''並行マップの誤用:''' Go 1.6で、マップの並行誤用の軽量でベストエフォートな検出が追加されました。このリリースでは、マップへの並行書き込みと反復処理を行うプログラムの検出がサポートされ、その検出器が改善されました。 ; パフォーマンス: :# ガベージコレクションの一時停止が大幅に短縮され、通常は100マイクロ秒未満、多くの場合10マイクロ秒程度になりました。 :# deferred関数呼び出しのオーバーヘッドが約半分に削減されました。 :# GoからCへの呼び出しのオーバーヘッドが約半分に削減されました。 ; 標準ライブラリ: :# '''Examples:''' 多くのパッケージに例が追加されました。 :# '''Sort:''' sortパッケージに、less関数を指定してスライスをソートするための便利な関数Sliceが含まれるようになりました。 :# '''HTTP/2 Push:''' net/httpパッケージに、HandlerからHTTP/2サーバープッシュを送信するメカニズムが含まれるようになりました。 :# '''HTTPサーバーの正常シャットダウン:''' HTTPサーバーは、新しいServer.Shutdownメソッドを使用した正常シャットダウンと、新しいServer.Closeメソッドを使用した突然のシャットダウンをサポートするようになりました。 :# '''コンテキストのサポート:''' context.Contextの標準ライブラリへの採用を継続し、Go 1.8は、既存のパッケージへのコンテキストサポートを追加しました。 :# '''Mutex競合プロファイリング:''' ランタイムとツールが、競合するmutexのプロファイリングをサポートするようになりました。 Go 1.8には、上記以外にも多くの追加、改善、および修正が含まれています。詳細については、公式のリリースノートを参照してください。 === Go 1.7 === Go 1.7が、2016年8月にリリースされました<ref>{{cite web | url = https://go.dev/doc/go1.7 | title = Go 1.7 Release Notes - The Go Programming Language | accessdate = 2025-05-20 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.7 | title = Go 1.7 is released - The Go Blog | date = 2016/08/15 | accessdate = 2025-05-20 }}</ref>。 主な変更点は以下の通りです。 ; 主な変更点 * '''言語仕様''': 終了ステートメントの定義を明確化(既存の挙動を正式化) * '''パフォーマンス''': x86-64向け新しいコンパイラバックエンドで5-35%の性能向上 * '''標準ライブラリ''': ** <code>context</code>パッケージが標準ライブラリに昇格 ** <code>net/http/httptrace</code>パッケージ追加 ** テスト階層構造をサポート(サブテスト/サブベンチマーク) * '''ツールチェーン''': ** ビルド時間の改善 ** バイナリサイズの削減(20-30%減少することも) ** ベンダリングサポートが正式機能に * '''ポート''': ** macOS 10.12 Sierraサポート追加 ** Linux on z Systems(s390x)の実験的サポート追加 ; 互換性 Go 1の互換性保証を維持。ほとんどのGoプログラムは変更なしで動作する見込み。 ; その他の注目点 * ガベージコレクションの一時停止時間が短縮 * 多数の標準ライブラリで10%以上の性能改善 * Unicode 9.0サポート * WindowsでのメモリOS返還サポート * 実行トレースの収集オーバーヘッドが大幅改善(400%→25%) このリリースは主にツールチェーン、ランタイム、ライブラリの実装改善に焦点を当てています。 === Go 1.6 === Go 1.6が、2016年2月17日にリリースされました<ref>{{cite web | url = https://go.dev/blog/go1.6 | title = Go 1.6 Release Notes - The Go Programming Language | accessdate = 2025-06-29 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.6 | title = Go 1.6 is released - The Go Blog | date = 2016/02/17 | accessdate = 2025-06-29 }}</ref>。 主な変更点は以下の通りです。 ; 主な変更点 * '''言語仕様''': 言語仕様の変更なし * '''パフォーマンス''': ** Go 1ベンチマークスイートのプログラムが平均数パーセント高速化 ** ガベージコレクターの一時停止時間がさらに短縮(特にメモリを大量に使用するプログラムで) ** <code>compress/bzip2</code>、<code>compress/gzip</code>、<code>crypto/aes</code>、<code>crypto/elliptic</code>、<code>crypto/ecdsa</code>、<code>sort</code>パッケージで10%以上の最適化 ** <code>sort.Sort</code>の実装が効率化され、約10%高速化 * '''標準ライブラリ''': ** <code>net/http</code>パッケージがHTTPS使用時にHTTP/2を透過的かつ自動的にサポート ** <code>text/template</code>パッケージにテンプレート再利用の新メカニズムを追加(アクション周りの空白除去、<code>{{block}}</code>アクション) * '''ツールチェーン''': ** パーサーがyacc生成のものから手書きのものに変更 ** <code>linux/amd64</code>向けにClang MemorySanitizerとの連携のための新しい<code>-msan</code>フラグを追加 ** リンカーに新しい<code>-libgcc</code>オプションを追加 ** Go 1.5で導入されたビルドモードを多くのシステムに拡張(<code>c-shared</code>、<code>shared</code>、新しい<code>pie</code>モード) ** <code>go</code>コマンドがベンダリングをデフォルトで有効化(Go 1.5では実験的機能) ** <code>go doc</code>コマンドの曖昧性解消を改善(ベンダリングされたコピーよりも元のパッケージを優先) ** <code>go vet</code>コマンドが関数やメソッドの値を<code>Printf</code>に誤って渡す診断を開始 * '''ポート''': ** 64ビットMIPS上のLinuxと32ビットx86上のAndroidへの実験的な新しいポートを追加 ; 互換性 Go 1の互換性保証を維持。ほとんどのGoプログラムは変更なしでコンパイルおよび実行される見込み。 ; その他の注目点 * ランタイムでマップの同時誤用を軽量に検出(検出された場合はプログラムがクラッシュ) * プログラム終了時のパニックについて、ランタイムがデフォルトで実行中のゴルーチンのスタックのみを出力 * Goのガベージコレクターとの互換性を確保するため、GoポインタとCコード間の共有ルールを明確化し、強制 * Windowsでのグローバルタイマー解像度の1ms強制を停止 * <code>-buildmode=c-archive</code>または<code>-buildmode=c-shared</code>でビルドされたアーカイブおよび共有ライブラリのシグナルハンドリングを変更 * <code>reflect</code>パッケージで、エクスポートされたフィールドを含む埋め込まれた非エクスポート構造体型に関する非互換性を解決 === Go 1.5 === Go 1.5が、2015年8月19日にリリースされました<ref>{{cite web | url = https://go.dev/blog/go1.5 | title = Go 1.5 Release Notes - The Go Programming Language | accessdate = 2025-06-29 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.5 | title = Go 1.5 is released - The Go Blog | date = 2015/08/19 | accessdate = 2025-06-29 }}</ref>。 主な変更点は以下の通りです。 ; 主な変更点 * '''言語仕様''': ** マップリテラルの要素型の省略を許可する構文の制限が緩和 * '''パフォーマンス''': ** ガベージコレクターが再設計され、並行処理可能に。一時停止時間が劇的に短縮され、通常10ミリ秒未満に ** スケジューラーの改善により、<code>GOMAXPROCS</code>のデフォルト値が論理CPU数に変更 * '''標準ライブラリ''': ** <code>flag</code>パッケージでよりクリーンな使用法メッセージ ** <code>math/big</code>に任意精度浮動小数点数用の新しい<code>Float</code>型を追加 ** LinuxおよびBSDシステム上のDNSリゾルバーの改善により、名前ルックアップのcgo要件を削除 ** <code>go/types</code>パッケージが標準ライブラリに移動 ** <code>reflect</code>パッケージに<code>ArrayOf</code>および<code>FuncOf</code>関数が追加 * '''ツールチェーン''': ** コンパイラとランタイムが完全にGoで記述され、GoコードベースからすべてのCコードが削除 ** 従来のツール名(例: <code>6g</code>、<code>8g</code>)が廃止され、<code>go tool compile</code>、<code>go tool asm</code>、<code>go tool link</code>などの単一バイナリに置き換え ** 中間オブジェクトファイルが<code>.6</code>、<code>.8</code>などの代わりに<code>.o</code>サフィックスを使用 ** <code>go/types</code>パッケージの移動に伴い、<code>vet</code>および<code>cover</code>ツールも移動 ** コンパイラが定数評価に<code>math/big</code>パッケージを使用 ** アセンブラが新しいネイティブGo実装になり、わずかな互換性変更あり ** リンカーに拡張されたリンクスタイル(共有ライブラリのビルドなど)のための<code>-buildmode</code>オプションを導入 ** <code>go tool vet</code>コマンドが構造体タグのより厳密な検証を実行 ** <code>go test</code>コマンドに新しい<code>-count</code>フラグ、<code>go generate</code>に<code>-run</code>オプションと新しい環境変数を追加 ** <code>go get</code>コマンドに新しい<code>-insecure</code>フラグを追加 ** 外部依存関係の「ベンダリング」に対する実験的なサポートが導入(<code>go</code>コマンドが有効化) * '''ポート''': ** Snow Leopardおよび<code>dragonfly/386</code>のサポートが終了 ** <code>darwin/arm</code>、<code>darwin/arm64</code>(AppleのiPhoneおよびiPad用)、<code>linux/arm64</code>、<code>ppc64</code>、<code>ppc64le</code>(IBM 64ビットPowerPC)を含む新しいポートがソースから利用可能 ** FreeBSD (8-STABLE以上) およびNaCl (SDKバージョンpepper-41) の特定の要件 ** Solarisポートで完全な<code>cgo</code>サポートと<code>net</code>および<code>crypto/x509</code>の改善 ; 互換性 主要なアーキテクチャ変更にもかかわらず、Go 1の互換性保証を維持。ほとんどのGoプログラムは以前と同様にコンパイルおよび実行される見込み。ただし、ゴルーチンスケジューリング順序に暗黙的に依存するプログラムや、複数のコアでの実行を想定していないプログラム(<code>GOMAXPROCS</code>のデフォルト値変更のため)は更新が必要になる場合がある。 ; その他の注目点 * 内部パッケージのサポートがすべてのリポジトリで提供 * <code>install</code>サブコマンドがソースディレクトリに<code>build</code>によって作成されたバイナリを削除 * 新しいビルドオプションとして<code>-asmflags</code>、<code>-buildmode</code>、<code>-pkgdir</code>、<code>-toolexec</code>が追加 * <code>-ccflags</code>オプションが削除 === Go 1.4 === Go 1.4が、2014年12月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.4 | title = Go 1.4 Release Notes - The Go Programming Language | date = 2014/12/10 | accessdate = 2025/05/20 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.4 | title = Go 1.4 is released - The Go Programming Language | date = 2014/12/10 | accessdate = 2025/05/20 }}</ref>。 Go 1.4は、Go 1.3から約半年後のリリースとなり、プロジェクトの歴史において「実装のクリーンアップ」と「将来のプラットフォームへの布石」となる重要なバージョンです。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.4 Go 1.4 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.4 Go 1.4 is released! The Go Blog]}} ; 言語の変更点: :# '''for-rangeループの簡略化''':ループ変数を必要としない場合に、変数名を省略して <code>for range s { ... }</code> と記述できるようになりました。 :# '''メソッド呼び出しの厳格化''':ポインタではないレシーバを持つメソッドを、二重ポインタ(<code>**T</code>)から直接呼び出すことが禁止されました。 ; 新しいプラットフォームのサポート: :# '''Androidのサポート''':<code>GOOS=android</code>、<code>GOARCH=arm</code> が追加されました。これにより、Goで書かれたライブラリをAndroidアプリ(Java/Kotlin)から呼び出すための基盤が整いました。 :# '''ARM64の実験的サポート''':将来の64ビットARMプロセッサを見据え、<code>linux/arm64</code> のサポートが開始されました。 ; ツールの改善: :# '''go generateコマンドの導入''':ソースコード内のコメント(<code>//go:generate ...</code>)をスキャンしてコード生成ツールを実行する新しいサブコマンドが追加されました。これにより、<code>stringer</code> などのツールを用いたメタプログラミングが容易になりました。 :# '''ビルド速度の改善''':コンパイラの一部がCからGoへ書き換えられ始めた過渡期であり、ツールチェーン全体の整理が進められました。 ; ランタイムの改善: :# '''スタック管理の変更''':連続スタック(contiguous stacks)の導入により、以前の「セグメントスタック」で発生していた「ホットスプリット問題(スタックの拡張と縮小が頻発してパフォーマンスが低下する現象)」が解消されました。 :# '''ガベージコレクタの改良''':ガベージコレクションの並行処理化に向けた準備として、ランタイムの内部構造が大幅に再設計されました。 ; 標準ライブラリの改善: :# '''contextパッケージの萌芽''':この時期、<code>golang.org/x/net/context</code> パッケージが開発され、Google内部で広く使われ始めました(後にGo 1.7で標準ライブラリ入りします)。 :# '''OSインターフェースの拡充''':<code>os</code> パッケージや <code>net</code> パッケージにおいて、システムリソースへのアクセス効率が向上しました。 Go 1.4は、Go言語が誕生以来使用してきたC言語による実装から、Go自身でGoをコンパイルする「セルフホスティング」へと移行するための重要なステップとなりました。 === Go 1.3 === Go 1.3が、2014年6月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.3 | title = Go 1.3 Release Notes - The Go Programming Language | date = 2014/06/18 | accessdate = 2025/05/19 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.3 | title = Go 1.3 is released - The Go Programming Language | date = 2014/06/18 | accessdate = 2025/05/19 }}</ref>。 Go 1.3は、Go 1.2から約半年後のリリースとなり、言語仕様自体の変更を含まない一方で、「ランタイムの大幅なパフォーマンス向上」と「ツールチェーンの再設計・近代化」に深く焦点を当てた重要なバージョンです。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.3 Go 1.3 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.3 Go 1.3 is released! The Go Blog]}} ; 言語の変更点: :# '''仕様変更なし''':Go 1互換性ガイドラインに基づき、言語仕様自体への変更や追加はありません。既存のソースコードはそのまま完全にコンパイル可能です。 ; 新しいプラットフォームのサポート: :# '''Solarisのサポート''':<code>GOOS=solaris</code>、<code>GOARCH=amd64</code> が追加され、SolarisおよびIllumosベースのシステムが公式にサポートされました。 :# '''Plan 9のサポート改善''':<code>GOOS=plan9</code> において、AMD64アーキテクチャ(<code>GOARCH=amd64</code>)のサポートが追加されました。 :# '''Native Client (NaCl) の拡張''':Googleの安全なコード実行環境であるNative Clientにおいて、従来のx86(32ビット/64ビット)に加えてARMアーキテクチャ(<code>GOARCH=arm</code>)がサポートされました。 ; ツールの改善: :# '''リンカーとコンパイラの再構成''':C言語で書かれていた従来のツールチェーン(<code>6g</code>、<code>6l</code> など)を、Go言語自身で書き換える(セルフホスティング)ための前段階として、リンカーの内部構造を分割・整理する基礎工作が行われました。 :# '''godocの静的解析機能''':<code>godoc</code> に高度な静的解析機能(型分析、コールグラフ、メソッドセットの表示など)が統合され、コードブラウジングが強力になりました。 :# '''go testの機能拡張''':<code>go test -cpu</code> フラグで複数のCPUカウントをカンマ区切りで指定できるようになり、異なる並行度でのテストが容易になりました。また、ベンチマーク中のメモリアロケーション統計(<code>-benchmem</code>)がデフォルトで強化されました。 ; ランタイムの改善: :# '''スタック管理の変更(スタックコピーの導入)''':従来の「セグメントスタック(分割スタック)」方式から、必要に応じて新しいメモリ領域を確保してスタック全体を丸ごとコピーする「スタックコピー(後に連続スタックへと繋がる基盤)」方式へ移行が始まりました。これにより、スタック境界で関数呼び出しが繰り返される際のオーバーヘッドが激減しました。 :# '''正確なガベージコレクション(Precise GC)の進展''':ガベージコレクタがさらに精密化され、スタック上のポインタと非ポインタ(整数など)を完全に区別できるようになりました。これにより、誤ってメモリが保持され続ける「メモリリーク(浮遊ポインタ問題)」が解消され、ヒープサイズが縮小しました。 ; 標準ライブラリの改善: :# '''sync.Poolの導入''':ガベージコレクションの負荷を軽減するため、割り当て済みのオブジェクトを再利用するための並行安全なキャッシュ機構 <code>sync.Pool</code> が追加されました。高性能なネットワークサーバーなどの実装で劇的な効果を発揮します。 :# '''パフォーマンスの最適化''':<code>crypto/x509</code>、<code>fmt</code>、<code>net</code>、<code>os</code>、<code>reflect</code> などの主要パッケージでリファクタリングが行われ、多くのアロケーションが削減されたことで、実行速度が全体的に大幅に向上しました。 Go 1.3は、目に見える新機能こそ控えめですが、ランタイムの足腰を徹底的に鍛え上げ、次期バージョン(Go 1.4)以降で本格化する「コンパイラの100% Go言語化(セルフホスティング)」および「完全並行GC」へと向かうための、極めて強固なバイパス(土台)を築いたリリースです。 === Go 1.2 === Go 1.2が、2013年12月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.2 | title = Go 1.2 Release Notes - The Go Programming Language | date = 2013/12/01 | accessdate = 2025/05/20 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.2 | title = Go 1.2 is released - The Go Programming Language | date = 2013/12/01 | accessdate = 2025/05/20 }}</ref>。 Go 1.2は、Go 1.1のリリースから約半年後に提供され、言語仕様への細かな利便性の向上、開発ツールの強力なアップグレード、そしてランタイムのさらなる安定化をもたらしたバージョンです。互換性を維持しつつ、日々の開発体験を向上させる実用的な変更が多く含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.2 Go 1.2 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.2 Go 1.2 is released! The Go Blog]}} ; 言語の変更点: :# '''3引数スライス(スライス容量の制御)''':スライス式において、従来の <code>s[i:j]</code> に加え、3つ目の引数を指定する <code>s[i:j:k]</code> という構文(3-index slices)が導入されました。これにより、得られる部分スライスの容量(<code>cap</code>)を最大 <code>k</code> までに制限できるようになり、サブスライスへの追加操作(<code>append</code>)が意図せず元配列の背後にあるメモリを上書きしてしまうリスクを安全に排除できるようになりました。 ; 新しいプラットフォームのサポート: :# '''特定のアーキテクチャへの特記なし''':既存のOS(Linux、Mac OS X、FreeBSD、Windowsなど)およびアーキテクチャ(amd64、386、arm)への最適化とバグ修正が中心であり、新しいOSターゲットの追加はこのバージョンでは行われませんでした。 ; ツールの改善: :# '''テストカバレッジツールの導入(go test -cover)''':<code>go test</code> コマンドに <code>-cover</code> フラグが追加され、コードのテストカバレッジを測定できるようになりました。これに伴い、新ツール <code>go tool cover</code> が提供され、どのコードパスが実行され、どのパスが実行されていないかをブラウザ上で色分けして視覚的に確認できるHTMLレポートの生成が可能になりました。 :# '''go testの並行実行制御''':<code>go test</code> に <code>-cpu</code> フラグの動作が調整されたほか、複数パッケージのテストを並行して実行するための <code>-p</code> フラグの挙動が洗練されました。 ; ランタイムの改善: :# '''ゴルーチンのプリエンプション(協調的スケジューリングの強化)''':ランタイムのスケジューラが拡張され、関数呼び出しのタイミングで自動的にプリエンプション(実行権の譲渡)チェックが挟まれるようになりました。これにより、タイトなループを実行し続ける特定のゴルーチンが1つのスレッドを占有し続け、他のゴルーチンやガベージコレクション(GC)の呼び出しを停止させてしまう問題(飢餓状態)が大幅に緩和されました。 :# '''スレッド制限の導入''':デフォルトで1つのプログラムが作成できるオペレーティングシステム(OS)のスレッド数が最大10,000個に制限されました(<code>runtime/debug.SetMaxThreads</code> で変更可能)。これは、無限にスレッドが生成されてシステム全体のメモリを枯渇させる暴走バグを防ぐための安全策です。 ; 標準ライブラリの改善: :# '''imageパッケージの刷新''':<code>image</code> および <code>image/color</code> パッケージにいくつかの新しいインターフェースと、パフォーマンス向上のためのピクセル精度の最適化が施されました。 :# '''多くのパッケージでの最適化''':<code>compress/bzip2</code>、<code>encoding/json</code>、<code>net</code> などの主要パッケージで、不要なアロケーションの削減やアルゴリズムのブラッシュアップが行われ、実行効率が向上しました。 Go 1.2は、仕様を大きく変えることなく、3引数スライスによる「堅牢性の向上」や、カバレッジツールによる「品質管理の容易化」、そしてスケジューラ改善による「並行処理の安定化」を確実にもたらしました。地味ながらも、プロダクション環境での信頼性を引き上げる確実な一歩となったリリースです。 === Go 1.1 === Go 1.1が、2013年5月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.1 | title = Go 1.1 Release Notes - The Go Programming Language | date = 2013/05/13 | accessdate = 2025/05/19 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.1 | title = Go 1.1 is released - The Go Programming Language | date = 2013/05/13 | accessdate = 2025/05/19 }}</ref>。 Go 1.1は、2012年3月のGo 1.0リリース以来、初めてのメジャーアップデートとなります。Go 1の「互換性約束(Compatibility Guarantee)」を厳格に守りつつ、コミュニティからのフィードバックを反映して、パフォーマンスの大幅な向上、言語仕様の洗練、そして開発ツールの強化が図られました。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.1 Go 1.1 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.1 Go 1.1 is released! The Go Blog]}} ; 言語の変更点: :# '''メソッド値(Method Values)の導入''':オブジェクトのメソッドを、レシーバ(そのオブジェクト自身)を束縛した状態の関数値として直接取り出せるようになりました。たとえば、f := obj.Method と記述して、後から f() として呼び出すことが可能です。これにより、イベントハンドラやコールバックの記述が非常に簡潔になりました。 :# '''戻り値の要件の厳格化(および合理化)''':値を返す関数において、制御フローの末尾(terminate statement)に return がない場合のコンパイラチェックが厳密になりました。一方で、panic や無限ループで終わるパスなど、明らかに終端に到達しないコードベースでは return を省略できるよう仕様が整理されました。 :# '''整数除算のゼロ除算のランタイムエラー化''':定数ではない変数によるゼロ除算(x / 0)が、コンパイル時だけでなく実行時にも一貫してランタイムパニックを発生させるよう挙動が統一されました。 ; 新しいプラットフォームのサポート: :# '''ARMアーキテクチャのサポート強化''':GOARCH=arm において、浮動小数点演算のハードウェアアクセラレーション(GOARM=7 など)の対応が進み、Raspberry Piなどの組み込みデバイスでの実行速度が飛躍的に向上しました。 :# '''プラットフォームの実験的追加''':freebsd/arm や netbsd/386 などの新しいOS・アーキテクチャの組み合わせへの移植が開始されました。 ; ツールの改善: :# '''goコマンドの機能拡充''':go get や go test などのサブコマンドが大幅に強化されました。特に、他のリポジトリの依存関係の処理がスムーズになり、並行してテストを実行する仕組みが洗練されました。 :# '''レースディテクタ(Race Detector)の搭載''':データ競合(Data Race)を検出するための強力なツール -race フラグが go test、go run、go build に導入されました(ThreadSanitizerをバックエンドに使用)。並行処理プログラムにおいて、複数のゴルーチンが同期なしに同じメモリにアクセスする潜在的バグを自動で暴き出すことができます。 :# '''vetツールの標準化''':コードの静的解析を行い、ミス(Printf のフォーマット指定子の間違いなど)を検出する go vet コマンドが正式にツールチェーンに統合されました。 ; ランタイムの改善: :# '''パフォーマンスの劇的な向上(GCとスケジューラ)''':メモリ割り当て(アロケータ)の効率化、およびガベージコレクタ(GC)のマップ処理の最適化により、多くのプログラムで数10%〜2倍以上の高速化を達成しました。 :# '''新スケジューラ(G-M-Pモデル)への刷新''':ランタイムのゴルーチンスケジューラが全面的に書き換えられました。これまでの単一のグローバルロックによるボトルネックが解消され、複数CPUコア(GOMAXPROCS)を有効にしたマルチスレッド環境における並行処理のスケール性能が爆発的に向上しました。 ; 標準ライブラリの改善: :# '''netパッケージの刷新''':ネットワーク接続のタイムアウト処理や非同期I/Oのバックエンドが刷新され、より高負荷な通信を安定して捌けるようになりました。 :# '''新規パッケージの追加''':文字列やバイト列の効率的なプールを提供する bytes.Buffer の見直しや、データ構造を扱う各種内部パッケージの最適化が行われました。 Go 1.1は、最初のリリースで確立された「安定性」という土台の上に、プロダクション環境で戦うための「圧倒的な速度」と「バグを撃退する強力なツール(レースディテクタ)」を実装した、Go言語の進化において最もエキサイティングなマイルストーンの1つです。 === Go 1.0 === Go 1.0が、2012年3月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.0 | title = Go 1.3 Release Notes - The Go Programming Language | date = 2012/03/28 | accessdate = 2025/05/19 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.0 | title = Go 1.0 is released - The Go Programming Language | date = 2012/03/28 | accessdate = 2025/05/19 }}</ref>。 Go 1.0は、2009年のオープンソース化以来、数年間にわたる活発な開発とコミュニティからのフィードバックを経て到達した、Goプロジェクト史上初の「安定版(Major Stable Release)」です。最大の特徴は、企業や開発者がプロダクション環境で安心して採用できるよう、将来にわたるソースコードの互換性を保証する「Go 1 互換性約束(Compatibility Guarantee)」が確立された点にあります。最も注目すべき変更点と仕様の確定は以下です。{{Main|[https://go.dev/doc/go1.0 Go 1.0 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.0 Go 1.0 is released! The Go Blog]}} ; 言語の確定と変更点: :# '''互換性の保証(Go 1の約束)''':Go 1.0で記述された標準仕様に準拠するソースコードは、将来のGo 1.x系バージョンにおいても修正なしでコンパイルでき、同じ動作をすることが保証されました。これにより、言語仕様の頻繁な変更に追われるリスクが解消されました。 :# '''新しい型システムと複素数''':complex64 および complex128 が組み込み型として完全に統合されました。また、エラー表現のための標準的なインターフェースとして error 型が導入され、従来の os.Error から置き換えられました。 :# '''マップとスライスのリテラル形式の洗練''':複合リテラル(Composite Literals)の記述において、要素の型を明示的に反復しなくても推論できるケースが増え、コードがより簡潔に記述できるようになりました。 ; プラットフォームのサポート: :# '''OSとアーキテクチャの公式サポート''':Linux(386/amd64/arm)、Mac OS X(Darwin 386/amd64)、FreeBSD(386/amd64)、およびWindows(386/amd64)が、第1級の市民として公式サポート対象となりました。 ; ツールの標準化: :# '''goコマンド(go tool)の誕生''':従来の 6g、6l、make、gotest、goinstall といったバラバラだったコンパイル・ビルド・パッケージ管理・テスト用のツール群が、すべて単一の go コマンド(go build, go install, go test, go get など)に統合されました。これにより、Makefileなしで依存関係を自動解決してビルドする近代的な開発環境が完成しました。 :# '''コードフォーマッタ(gofmt)の確定''':コードの自動整形ツール gofmt の挙動が公式スタイルとして固定され、コミュニティ全体で一貫した読みやすいコードベースを維持する文化が決定づけられました。 :# '''移行ツール(go fix)の提供''':週次ビルドや古いプレリリース(r60など)のコードを、Go 1.0の標準仕様へ自動的に書き換えるための go fix ツールが提供され、スムーズな移行が促されました。 ; ランタイムとメモリの改善: :# '''ガベージコレクタとスケジューラの基本設計''':並行処理を安全に行うためのゴルーチン(Goroutines)のスケジューリング機構、およびヒープメモリの自動管理を行うガベージコレクタ(GC)が、安定稼働を最優先とした第1世代の設計として統合されました。 ; 標準ライブラリの再編成: :# '''ディレクトリ構造の大規模な整理''':初期の雑多なパッケージ配置が見直され、現在の net/http、encoding/json、crypto といった論理的でクリーンな階層構造へと徹底的に再構成されました。 :# '''一貫したAPIデザイン''':すべてのパッケージにおいて、関数の命名規則(大文字開始によるエクスポート)や、エラーを関数の最後の戻り値((result, error))として返すシグネチャの統一が完了しました。 Go 1.0は、一言語のリリースにとどまらず、「言語仕様」「標準ツールチェーン」「標準ライブラリ」が三位一体となり、後方互換性を強く宣言したことで、Go言語が実験的なプロジェクトから、世界規模のクラウドインフラやバックエンドシステムを支える実用言語へと本格的に羽ばたくための不朽の原点となりました。 == Go1.0前史 == Goが2012年3月にメジャー安定版である「Go 1.0」として結実するまでには、約4年半にわたる「知的な実験」と「過酷な試行錯誤」の歴史(前史)が存在します。 UNIXやC言語、Plan 9を生み出した伝説的なエンジニアたちが、Googleという巨大なインフラの中で直面した課題を解決するために始めたプロジェクト――それがGoの始まりでした。 === 1. プロジェクトの誕生と動機(2007年) === Goプロジェクトは、'''2007年9月21日'''、Googleのエンジニアであった'''ロバート・グリースマー(Robert Griesemer)'''、'''ロブ・パイク(Rob Pike)'''、'''ケン・トンプソン(Ken Thompson)'''の3人によるホワイトボードの前での議論から始まりました。 彼らが共有していたのは、当時のソフトウェア開発環境、特にGoogle内部で主流だったC++による大規模システム開発に対する強い「不満」と「危機感」でした。 * '''ハードウェアの進化との乖離''': コンピュータはマルチコア化し、大規模なクラスタで動作する時代になっていたにもかかわらず、C++やJavaなどの言語はシングルコア時代の設計を引きずっており、並行処理(Concurrency)の記述が非常に複雑でエラーを誘発しやすかったこと。 * '''ビルド時間の爆発''': Googleの超巨大なコードベースをC++でビルドすると、ヘッダーファイルの依存関係の複雑さから、コンパイルに数時間から数日を要する「ビルド待ち時間」が発生し、開発効率を著しく低下させていたこと。 * '''言語の肥大化と認知負荷''': 言語に機能(パラダイム)が追加され続けることで複雑化し、他人が書いたコードを理解するコストが跳ね上がっていたこと。 彼らは「'''システムプログラミング言語が持つべき『効率性・静的型付けの安全性』と、動的言語(PythonやJavaScriptなど)が持つ『開発の手軽さ・俊敏さ』を高い次元で融合させた、21世紀のインフラのための新しい言語'''」を求めたのです。 === 2. 黎明期の設計と実装(2008年) === 2008年初頭、言語のプロトタイプ作成が本格化します。この時期に、現在のGoの根幹をなす特徴的な機能が次々と形作られていきました。 * '''コンパイラの着手''': ケン・トンプソンが、自身のUNIX時代の知見を活かしてC言語で独自のコンパイラ群(後にx86向けに <code>6g</code>、<code>6l</code> などと呼ばれるツールチェーン)を書き始めました。 * '''C言語ライクからの脱却''': 当初はC言語の純粋な拡張として構文を検討していましたが、宣言の記述順序(型を後ろに書く <code>x int</code> 形式)の変更や、セミコロンの自動挿入、暗黙の型変換の禁止など、クリーンで厳格な構文へと舵を切りました。 * '''インターフェースと並行処理の融合''': ロバート・グリースマーによる構造的型付け(Structural Typing)に基づく「明示的な宣言を必要としないインターフェース」の設計、そしてロブ・パイクによるPlan 9(NewsqueakやAlef)の知見をベースにした「チャネル(Channels)とゴルーチン(Goroutines)による通信」のアイデアが組み込まれました。 この年、コンパイラ開発の専門家であるイアン・ランス・テイラー(Ian Lance Taylor)'''がプロジェクトに参加し、GCCのフロントエンドとして <code>gccgo</code> の開発を開始。これにより、Goの設計が特定のコンパイラ実装に依存しない汎用的なものであることが証明されました。また、後にGoの主要開発者となる'''ラサ・コックス(Russ Cox)も加わり、ランタイムや標準ライブラリの整備が急速に進みます。 === 3. オープンソース化(2009年11月) === '''2009年11月10日'''、Goは世界に向けてオープンソースプロジェクトとして電撃的に発表されました。 当初は「Googleがまた新しい言語を作った」という好奇の目で見られましたが、その極端なシンプルさとコンパイルの圧倒的な速さは、初期の目の肥えたハッカーたちを魅了しました。 しかし、オープンソース化直後のGo(いわゆる「プレGo 1.0」時代)は、現在のモダンなGoからは想像もつかないほど激動の、そして「毎週のようにコードが壊れる」過酷な開発環境でした。 === 4. ウィークリービルド(Weekly)とリリース(R)の時代(2009年 - 2011年) === Go 1.0がリリースされるまでの約2年間、公式の安定版というものは存在せず、開発は <code>weekly</code>(週次ビルド)および <code>release</code>(r56, r60 など)というバージョン名で刻まれていました。 この時代の主な特徴と混乱は以下の通りです。 ==== ① 頻繁な言語仕様の変更(破壊的変更) ==== 言語のコア機能や組み込み関数が、毎週のように追加・削除・変更されました。 * '''<code>closed</code> から <code>panic</code> へ''': 当初、チャネルが閉じられたかどうかを検知する組み込み関数 <code>closed()</code> がありましたが、後に削除され、現在の <code>v, ok := <-ch</code> 形式へ統合されました。 * '''<code>map</code> のアクセス構文''': マップにキーが存在するかを調べる構文も二転三転し、一時は専用のビルトイン関数が検討されたこともありました。 * '''新しいキーワードの追加と廃止''': メモリ割り当ての <code>new</code> と <code>make</code> の役割分担の整理や、初期にあった特殊な制御構文のスクラップ・アンド・ビルドが繰り返されました。 ==== ② ばらばらのツールチェーン ==== 当時はまだ <code>go</code> コマンドがありませんでした。開発者は以下のような手順を手動(またはMakefile)で行っていました。 * x86-64環境であれば、コンパイルには <code>6g</code>、リンクには <code>6l</code> コマンドを直接叩く。 * 32ビットx86であれば <code>8g</code> / <code>8l</code>、ARMであれば <code>5g</code> / <code>5l</code> を使う。 * パッケージのインストールには <code>goinstall</code>、テストには <code>gotest</code> という別個のスクラップスクリプトが使われており、プロジェクトのビルド管理は非常に煩雑でした。 ==== ③ 標準ライブラリの未成熟と「os.Error」 ==== 現在おなじみの <code>error</code> インターフェース(組み込み型)は存在せず、<code>os</code> パッケージの中に <code>os.Error</code> という型として定義されていました。このため、文字通りあらゆるパッケージが <code>os</code> パッケージに依存するという、不健全な依存構造(循環参照のリスク)を抱えていました。 === 5. 「Go 1」へのカウントダウンと大掃除(2011年後半) === 世界中で徐々にGoが本番環境(初期のCloudflareやSoundCloudなど)で使われ始めるにつれ、「毎週のように仕様が変わり、アップデートするたびにコードが動かなくなる言語は、企業のシステムでは怖くて使えない」という悲鳴が上がりました。 これを受けたコア開発チームは、言語を広く普及させるためには'''「一切の破壊的変更を止め、後方互換性を永久に保証するマイルストーン」'''が必要であると決断します。これが'''「Go 1 共同宣言(Go 1 Release Planning)」'''です。 2011年後半から2012年3月にかけて、チームは「最後の大掃除」に着手しました。 * '''<code>os.Error</code> から 組み込みの <code>error</code> への格上げ''': 依存関係をクリーンにするため、言語自体の組み込み型として <code>error</code> インターフェースを再定義しました。 * '''パッケージの統廃合''': 雑多に広がっていた標準ライブラリ(<code>container/vector</code> の廃止、<code>os/signal</code> への整理など)のレイアウトを徹底的にリファクタリングしました。 * '''<code>go</code> コマンドの誕生''': ラサ・コックスらにより、バラバラだったコンパイル環境を1つに統合する <code>go</code> コマンドが設計され、Makefileが不要なモダンなビルドエコシステムが完成しました。 * '''<code>go fix</code> の提供''': これまで毎週の破壊的変更に苦しんできた世界中の開発者のために、古いプレリリースのソースコードを自動的に「Go 1.0 仕様」へと一括置換・修正してくれる救済ツール(<code>go fix</code>)が開発されました。 === そして「原点」へ === 2012年3月28日、すべての仕様が凍結され、未来永劫の互換性を誓った'''Go 1.0'''が正式にリリースされました。 カオスに満ちた4年半の「前史」で流された無数のリファクタリングの血と、UNIXの巨匠たちがこだわった「引き算の美学(不要な機能を入れない)」があったからこそ、Goは今日に至るまで「10年前のコードが今でもそのまま動く」という、圧倒的な安定性と信頼性を手に入れることができたのです。 == 脚註 == <references /> == 参考文献 == *{{cite book | url = https://go.dev/ref/spec | title = The Go Programming Language Specification | date = JJune 13, 2024 | publisher = The Go website }} == 下位階層のページ == *[[Go/&^]] *[[Go/0]] *[[Go/0.0]] *[[Go/:=]] *[[Go/=]] *[[Go/Cross-package inlining]] *[[Go/Cのif-elseのエラーパターン解消に関するGoの選択]] *[[Go/EBNF]] *[[Go/Goのコードでgoのバージョンを調べる方法]] *[[Go/Goのプログラムがどんなアセンブリにコンパイルされるか?]] *[[Go/Goコンパイラの変遷]] *[[Go/HTTP]] *[[Go/Hypot]] *[[Go/Keywords]] *[[Go/Mid-stack inlining]] *[[Go/Predeclared identifiers]] *[[Go/Size class]] *[[Go/Standard library]] *[[Go/Standard library/errors]] *[[Go/Standard library/fmt]] *[[Go/Standard library/os]] *[[Go/Zero value]] *[[Go/analysis]] *[[Go/any]] *[[Go/append]] *[[Go/bool]] *[[Go/break]] *[[Go/byte]] *[[Go/cap]] *[[Go/case]] *[[Go/cgoでGoのコードからCの関数を利用する]] *[[Go/chan]] *[[Go/clear]] *[[Go/close]] *[[Go/comparable]] *[[Go/complex]] *[[Go/complex128]] *[[Go/complex64]] *[[Go/const]] *[[Go/continue]] *[[Go/copy]] *[[Go/core type]] *[[Go/default]] *[[Go/defer]] *[[Go/defer,panicとrecover]] *[[Go/delete]] *[[Go/else]] *[[Go/else if]] *[[Go/error]] *[[Go/fallthrough]] *[[Go/false]] *[[Go/flag]] *[[Go/float32]] *[[Go/float64]] *[[Go/for]] *[[Go/func]] *[[Go/go]] *[[Go/go.mod]] *[[Go/go.work]] *[[Go/gofmtコマンド]] *[[Go/goto]] *[[Go/goコマンド]] *[[Go/goコマンド/bug]] *[[Go/goコマンド/build]] *[[Go/goコマンド/clean]] *[[Go/goコマンド/doc]] *[[Go/goコマンド/env]] *[[Go/goコマンド/fix]] *[[Go/goコマンド/fix/any]] *[[Go/goコマンド/fix/bloop]] *[[Go/goコマンド/fix/buildtag]] *[[Go/goコマンド/fix/errorsastype]] *[[Go/goコマンド/fix/fmtappendf]] *[[Go/goコマンド/fix/forvar]] *[[Go/goコマンド/fix/hostport]] *[[Go/goコマンド/fix/inline]] *[[Go/goコマンド/fix/mapsloop]] *[[Go/goコマンド/fix/minmax]] *[[Go/goコマンド/fix/newexpr]] *[[Go/goコマンド/fix/omitzero]] *[[Go/goコマンド/fix/plusbuild]] *[[Go/goコマンド/fix/rangeint]] *[[Go/goコマンド/fix/reflecttypefor]] *[[Go/goコマンド/fix/slicescontains]] *[[Go/goコマンド/fix/slicessort]] *[[Go/goコマンド/fix/stditerators]] *[[Go/goコマンド/fix/stringsbuilder]] *[[Go/goコマンド/fix/stringscut]] *[[Go/goコマンド/fix/stringscutprefix]] *[[Go/goコマンド/fix/stringsseq]] *[[Go/goコマンド/fix/testingcontext]] *[[Go/goコマンド/fix/waitgroup]] *[[Go/goコマンド/fmt]] *[[Go/goコマンド/generate]] *[[Go/goコマンド/get]] *[[Go/goコマンド/help]] *[[Go/goコマンド/install]] *[[Go/goコマンド/list]] *[[Go/goコマンド/mod]] *[[Go/goコマンド/run]] *[[Go/goコマンド/telemetry]] *[[Go/goコマンド/test]] *[[Go/goコマンド/tool]] *[[Go/goコマンド/tool/addr2line]] *[[Go/goコマンド/tool/asm]] *[[Go/goコマンド/tool/cgo]] *[[Go/goコマンド/tool/compile]] *[[Go/goコマンド/tool/covdata]] *[[Go/goコマンド/tool/covdata/debugdump]] *[[Go/goコマンド/tool/covdata/func]] *[[Go/goコマンド/tool/covdata/intersect]] *[[Go/goコマンド/tool/covdata/merge]] *[[Go/goコマンド/tool/covdata/percent]] *[[Go/goコマンド/tool/covdata/pkglist]] *[[Go/goコマンド/tool/covdata/subtract]] *[[Go/goコマンド/tool/covdata/textfmt]] *[[Go/goコマンド/tool/cover]] *[[Go/goコマンド/tool/dist]] *[[Go/goコマンド/tool/link]] *[[Go/goコマンド/tool/nm]] *[[Go/goコマンド/tool/objdump]] *[[Go/goコマンド/tool/pack]] *[[Go/goコマンド/tool/pprof]] *[[Go/goコマンド/tool/preprofile]] *[[Go/goコマンド/tool/test2json]] *[[Go/goコマンド/tool/trace]] *[[Go/goコマンド/version]] *[[Go/goコマンド/vet]] *[[Go/goコマンド/vet/appends]] *[[Go/goコマンド/vet/asmdecl]] *[[Go/goコマンド/vet/assign]] *[[Go/goコマンド/vet/atomic]] *[[Go/goコマンド/vet/bools]] *[[Go/goコマンド/vet/buildtag]] *[[Go/goコマンド/vet/cgocall]] *[[Go/goコマンド/vet/composites]] *[[Go/goコマンド/vet/copylocks]] *[[Go/goコマンド/vet/defers]] *[[Go/goコマンド/vet/directive *[[Go/goコマンド/vet/errorsas]] *[[Go/goコマンド/vet/framepointer]] *[[Go/goコマンド/vet/hostport]] *[[Go/goコマンド/vet/httpresponse]] *[[Go/goコマンド/vet/ifaceassert]] *[[Go/goコマンド/vet/loopclosure]] *[[Go/goコマンド/vet/lostcancel]] *[[Go/goコマンド/vet/nilfunc]] *[[Go/goコマンド/vet/printf]] *[[Go/goコマンド/vet/shift]] *[[Go/goコマンド/vet/sigchanyzer]] *[[Go/goコマンド/vet/slog]] *[[Go/goコマンド/vet/stdmethods]] *[[Go/goコマンド/vet/stdversion]] *[[Go/goコマンド/vet/stringintconv]] *[[Go/goコマンド/vet/structtag]] *[[Go/goコマンド/vet/testinggoroutine]] *[[Go/goコマンド/vet/tests]] *[[Go/goコマンド/vet/timeformat]] *[[Go/goコマンド/vet/unmarshal]] *[[Go/goコマンド/vet/unreachable]] *[[Go/goコマンド/vet/unsafeptr]] *[[Go/goコマンド/vet/unusedresult]] *[[Go/goコマンド/vet/waitgroup]] *[[Go/goコマンド/work]] *[[Go/goコマンド/work/init]] *[[Go/if]] *[[Go/imag]] *[[Go/import]] *[[Go/int]] *[[Go/int16]] *[[Go/int32]] *[[Go/int64]] *[[Go/int8]] *[[Go/interface]] *[[Go/iota]] *[[Go/iter.Seq版エラトステネスの篩]] *[[Go/len]] *[[Go/make]] *[[Go/map]] *[[Go/max]] *[[Go/min]] *[[Go/named type]] *[[Go/new]] *[[Go/nil]] *[[Go/os/Args]] *[[Go/package]] *[[Go/panic]] *[[Go/print]] *[[Go/println]] *[[Go/range]] *[[Go/real]] *[[Go/recover]] *[[Go/return]] *[[Go/rune]] *[[Go/select]] *[[Go/string]] *[[Go/struct]] *[[Go/switch]] *[[Go/true]] *[[Go/type]] *[[Go/type literal]] *[[Go/uint]] *[[Go/uint16]] *[[Go/uint32]] *[[Go/uint64]] *[[Go/uint8]] *[[Go/uintptr]] *[[Go/underlying type]] *[[Go/var]] *[[Go/イテレータ]] *[[Go/エラー]] *[[Go/キーワードと宣言済み識別子]] *[[Go/クロスコンパイル]] *[[Go/コードギャラリー]] *[[Go/ジェネリクス]] *[[Go/ソースコードの表現方法]] *[[Go/パッケージ]] *[[Go/ファイル入出力]] *[[Go/ブロック・宣言とスコープ]] *[[Go/プログラムの初期化と実行]] *[[Go/ポインタ]] *[[Go/マップ]] *[[Go/メソッド]] *[[Go/メソッドとインターフェース]] *[[Go/メソッドチェイン]] *[[Go/メモリアロケータ]] *[[Go/ユーザー定義型の配列とスライス]] *[[Go/並行処理]] *[[Go/主要な標準インターフェース]] *[[Go/修飾子不要なインライン関数展開]] *[[Go/再帰的関数呼出し]] *[[Go/型]] *[[Go/型と値の特性]] *[[Go/変数]] *[[Go/字句的要素]] *[[Go/定数と変数]] *[[Go/実行の方法]] *[[Go/宣言済型]] *[[Go/宣言済定数]] *[[Go/宣言済識別子]] *[[Go/宣言済関数]] *[[Go/式]] *[[Go/改廃された技術]] *[[Go/数リテラルの精度と型]] *[[Go/文]] *[[Go/文法の概要]] *[[Go/条件分岐と繰り返し]] *[[Go/構造体]] *[[Go/標準ライブラリー]] *[[Go/環境構築]] *[[Go/算術演算と数学関数]] *[[Go/識別子のスコープ]] *[[Go/配列とスライス]] *[[Go/配列とスライスとエスケープ解析]] *[[Go/関数]] == 外部リンク == {{Wikipedia|Go (プログラミング言語)|Go}} {{Wikiversity|Topic:Go|Go}} * [https://go.dev/ The Go Programming Language] - 公式サイト * [https://go.dev/play/ The Go Playground] * [https://golang.design/gossa The Go SSA Playground] {{DEFAULTSORT:GO}} [[Category:Go|*]] [[Category:プログラミング言語]] {{NDC|007.64}} bfn83po2ek8bpayff1cwhfg8ktyfik7 305176 305172 2026-10-30T04:36:23Z Ef3 694 /* Go 1.26 */ Go 1.26が、2026年2月にリリースされました。 Go 1.26のリリースでは、言語仕様への便利な糖衣構文の追加、ツールチェーンの大幅な刷新、および新しい暗号化標準のサポートが含まれています。 305176 wikitext text/x-wiki {{Pathnav|メインページ|工学|情報技術|プログラミング}} [[Go]]は、Googleが開発したオープンソースの汎用プログラミング言語であり、特にバックエンドサービスやネットワークプログラミングを主な目的として設計されています<ref name="Introduction">{{cite book | url = https://go.dev/ref/spec#Introduction | title = The Go Programming Language Specification Language version go1.23 (June 13, 2024) | chapter = Introduction¶ | date = June 13, 2024 | publisher = The Go website }}</ref>。 静的型付け言語であるため、高速で効率的なプログラムを作成することができます。また、並行処理を簡単に実装できるgoroutineという仕組みを持ち、高い並行性を実現しています。 Goの文法はシンプルで読みやすく、効率的にコーディングできるため、開発者は迅速に新しいコードを書くことができます。ガベージコレクションによって自動的にメモリを管理するため、メモリ管理に関する手間を減らすことができます。 さらに、Windows、macOS、Linuxなど、多くのプラットフォームで動作し、標準ライブラリが豊富です。多くの外部ライブラリも存在するため、広範な用途に対応することができます。 Goのコミュニティは活発であり、多くの開発者が参加しています。質問や問題解決のためのリソースが豊富であり、新しい機能やライブラリが定期的にリリースされています。 この教科書では、初めてGoを学ぶ人から、より高度なトピックに興味のある人まで、幅広い読者を対象に、Goの基本から応用までを網羅的に解説します。 __TOC__ == 目次 == ;チュートリアル篇 : [[/環境構築|環境構築]] : [[/実行の方法|実行の方法]] {{---}} [[Go/実行の方法#Hello, World|Hello, World]] : [[/文法の概要|文法の概要]] : [[/変数|変数と型変換]] : [[/算術演算と数学関数|算術演算と数学関数]] : [[/条件分岐と繰り返し|条件分岐と繰り返し]] {{---}} if, switch, select, for, break, continue, return : [[/関数|関数]] : [[/メソッドとインターフェース|メソッドとインターフェース]] : [[/ジェネリクス|ジェネリクス]] : [[/再帰的関数呼出し|再帰的関数呼出し]] : [[/メソッドチェイン|メソッドチェイン]] : [[/defer,panicとrecover|defer, panicとrecover]] : [[/並行処理|並行処理]] : [[/配列とスライス|配列型とスライス型]] : [[/マップ|マップ型]] : [[/構造体|構造体型と構造体スライス]] : [[/イテレータ|イテレータ]] : [[/Goのプログラムがどんなアセンブリにコンパイルされるか?|Goのプログラムがどんなアセンブリにコンパイルされるか?]] {{---}} go tool objdump : [[/クロスコンパイル|クロスコンパイル]] {{---}} GOOS, GOARCH : [[/cgoでGoのコードからCの関数を利用する|cgoでGoのコードからCの関数を利用する]] {{---}} cgo : [[/Goのコードでgoのバージョンを調べる方法|Goのコードでgoのバージョンを調べる方法]] : [[/HTTP|HTTP]] : [[/ファイル入出力|ファイル入出力]] : [[/コードギャラリー|コードギャラリー]] ;リファレンス篇 : [[/ソースコードの表現方法|ソースコードの表現方法]] : [[/キーワードと宣言済み識別子|キーワードと宣言済み識別子]] {{---}} [[/キーワードと宣言済み識別子#キーワード|キーワード]]・[[/キーワードと宣言済み識別子#宣言済み識別子|宣言済み識別子]]([[/キーワードと宣言済み識別子#組込み型|組込み型]]・[[/キーワードと宣言済み識別子#組込み関数|組込み関数]]) : [[/字句的要素|字句的要素]] : [[/定数と変数|定数と変数]] {{---}} [[/定数と変数#定数|定数]]([[/定数と変数#iota|iota]])・[[/定数と変数#変数|変数]] : [[/型|型]] : [[/型と値の特性|型と値の特性]] : [[/ブロック・宣言とスコープ|ブロック・宣言とスコープ]] {{---}} [[/ブロック・宣言とスコープ#ブロック|ブロック]]・[[/ブロック・宣言とスコープ#宣言とスコープ|宣言とスコープ]] : [[/式|式]] {{---}} [[/式#演算子|演算子]] : [[/文|文]] : [[/パッケージ|パッケージ]] : [[/プログラムの初期化と実行|プログラムの初期化と実行]] : [[/エラー|エラー]] : [[/EBNF|EBNF]] ;[[/標準ライブラリー|標準ライブラリー篇]] ;[[/改廃された技術|改廃された技術]] == バージョン間の変更点 == Go は、約半年ごとに新しいバージョンがリリースされます。バージョンが変わると、言語仕様に追加変更があったり、ツールチェーン、ランタイム、およびライブラリの実装に変更が加えられることがあり、稀に既存のプログラムに影響が出ることもあります。以下に、最新のバージョンから順に変更点を記載します。 === Go 1.27 === Go 1.27が、2026年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.27 | title = Go 1.27 Release Notes - The Go Programming Language | date = 2026/08/10 | accessdate = 2026/08/11 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.27 | title = Go 1.27 is released! - The Go Programming Language | date = 2026/08/10 | accessdate = 2026/08/11 }}</ref>。 Go 1.27のリリースでは、言語仕様へのジェネリックメソッドの導入、ツールチェーンの大幅な刷新、新しい標準パッケージの追加、およびランタイムと標準ライブラリのパフォーマンス改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.27 Go 1.27 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.27 Go 1.27 is released! The Go Blog]}} ; 言語の変更点: :# ジェネリックメソッドのサポート:メソッド宣言自体で独自の型パラメータを定義できるようになりました。これにより、パッケージ全体ではなく特定のデータ型の名前空間内でジェネリック関数を追加できるようになっています(例: math/rand/v2 の (*Rand) N メソッド)。 :# 構造体リテラルのフィールドセレクタ拡張:構造体リテラルのキーとして、トップレベルのフィールド名だけでなく、埋め込み構造体などの有効なフィールドセレクタを使用できるようになりました。 :# 関数型推論の一般化:ジェネリック関数が変数への代入や変換が行われるすべてのコンテキストで機能型推論が適用されるようになりました。 ; 新しい標準パッケージ: :# encoding/json/v2 および encoding/json/jsontext:設定可能なオプションやより厳格なデフォルトを備えた JSON 処理のメジャーリビジョンと、低レベルの構文処理パッケージ。 :# crypto/mldsa:ポスト量子暗号の署名スキーム(FIPS 204)を実装。 :# uuid:UUID の生成およびパースをネイティブでサポート。 ; 実験的新機能: :# simd および simd/archsimd:SIMD 命令へのアクセスを提供する実験的パッケージ。 ; ランタイムとパフォーマンスの改善: :# 高速なメモリアロケーション:サイズ特化したメモリアロケーションルーチンの生成により、80バイト未満の小さなオブジェクトの割り当てコストが最大 30% 削減されました。 :# ゴリーチンリークプロファイル:runtime/pprof における goroutineleak プロファイルタイプが一般提供され、永久にブロックされたゴリーチンの自動検出が可能になりました。 ; ツールの改善: :# go fix の現代化(Modernizers)拡充:atomictypes、embedlit、slicesbackward、unsafefuncs などの新しい modernizers が追加されました。 :# go mod tidy のブロック整理:go 1.27 以降を指定するモジュールにおいて、複数の require ブロックが直接依存と間接依存の標準的な2つのブロックに自動的に統合されるようになりました。 :# go doc の拡張:package@version 構文や -ex オプションによる実行例の表示をサポートしました。 ; 標準ライブラリの改善: :# encoding/json:新しい v2 実装を基盤とするようになり、後方互換性を維持しながらアンマーシャル処理が大幅に高速化されました。 :# net/http/httptest:testing/synctest パッケージでの使用に適したインメモリの偽ネットワークを提供する NewTestServer が追加されました。 ; プラットフォームサポートの変更: :# bzr(Bazaar)のサポート削除:go コマンドによる bzr バージョン管理システムの直接フェッチサポートが削除されました。 :# macOS リンク時の変更:macOS 向けビルドにおいて、リンカが -macos および -macsdk コマンドラインオプションを受け付けるようになり、デフォルトの最小サポートバージョンが 13.0.0 に設定されるようになりました。 Go 1.27では、言語仕様へのジェネリックメソッドの追加、標準ライブラリの次世代化(v2)、および開発効率・性能の向上に重点が置かれています。 === Go 1.26 === Go 1.26が、2026年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.26 | title = Go 1.26 Release Notes - The Go Programming Language | date = 2026/02/10 | accessdate = 2026/02/11 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.26 | title = Go 1.26 is released! - The Go Programming Language | date = 2026/02/10 | accessdate = 2026/02/11 }}</ref>。 Go 1.26のリリースでは、言語仕様への便利な糖衣構文の追加、ツールチェーンの大幅な刷新、および新しい暗号化標準のサポートが含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.26 Go 1.26 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.26 Go 1.26 is released! The Go Blog]}} ; 言語の変更点: :# <code>new</code> 関数の拡張:組み込みの <code>new</code> 関数が、引数として初期値を指定する式を受け取れるようになりました。例えば <code>ptr := new(int64(300))</code> のように、1行で初期値付きのポインタを作成可能です。 :# 自己参照的なジェネリック型:型パラメータリスト内で、その型自体を参照することが可能になりました。これにより、複雑なデータ構造やインターフェースの柔軟な実装が可能になっています。 ; 新しい標準パッケージ: :# crypto/hpke:{{RFC|9180}} で定義されている Hybrid Public Key Encryption (HPKE) をサポート。 :# testing/cryptotest:暗号化実装の適合性を検証するための共通テストスイートを提供。 :# crypto/mlkem/mlkemtest:ML-KEM 実装のテスト用パッケージ。 ; 実験的新機能: :# simd/archsimd:SIMD(Single Instruction Multiple Data)命令へのアクセスを抽象化する実験的パッケージ。 ; ランタイムとパフォーマンスの改善: :# Green Tea GC のデフォルト有効化:[[#Go 1.25|Go 1.25]]で実験的だった「Green Tea」ガベージコレクタがデフォルトで有効になりました。 :# cgo オーバーヘッドの削減:cgo 呼び出しのベースライン・オーバーヘッドが約 30% 削減されました。 :# スタック割り当ての最適化:スライスのバッキングストアがスタックに割り当てられる条件が緩和され、メモリアロケーションの効率が向上しました。 ; ツールの改善: :# go fix の完全刷新:Go analysis フレームワークを使用して書き直されました。新しい「modernizers」機能により、古いコードを最新の言語仕様やライブラリ機能に適合させる修正案(数ダースの種類)が自動提示されます。 :# //go:fix inline ディレクティブ:このディレクティブが付与された関数への呼び出しを、go fix が自動的にインライン展開する機能が追加されました。 ; 標準ライブラリの改善: :# crypto/tls:TLS 1.3 における X25519MLKEM768 鍵交換(ポスト量子暗号)がデフォルトで有効化。 :# math/rand/v2:PCG および ChaCha8 アルゴリズムによる乱数生成の安定性と速度が向上。 ; プラットフォームサポートの変更: :# macOS:macOS 12 Monterey をサポートする最後のバージョンとなりました。次期 [[#Go 1.27|Go 1.27]] では macOS 13 Ventura 以降が必須となります。 :# Windows:予告通り 32-bit ARM (windows/arm) ポートのサポートが削除されました。 Go 1.26では、開発者のコーディング負荷を軽減する言語仕様の改善と、エコシステム全体を最新化(Modernize)するための強力なツール提供に重点が置かれています。 === Go 1.25 === Go 1.25が、2025年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.25 | title = Go 1.25 Release Notes - The Go Programming Language | date = 2025/08/12 | accessdate = 2025/09/27 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.25 | title = Go 1.25 is released! - The Go Programming Language | date = 2025/08/12 | accessdate = 2025/09/27 }}</ref>。 Go 1.25のリリースでは、実験的機能を含む多くの重要な改良が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.25 Go 1.25 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.25 Go 1.25 is released! The Go Blog]}} ; 言語の変更点: :# 言語仕様上の変更はありませんが、言語仕様書からcore typesの概念が削除され、専用の記述に置き換えられました。これによりより正確で理解しやすい仕様書となっています。 ; 新しい標準パッケージ: :# testing/synctest:並行コードのテストをサポートするパッケージ。仮想化されたクロック機能により、並行プログラムのテストがより効率的に行えるようになりました。Go 1.24では実験的機能(GOEXPERIMENT=synctest)でしたが、Go 1.25で正式にサポートされました。 ; 実験的新機能: :# 新しい実験的ガベージコレクター:GOEXPERIMENT=greenteagcで有効化可能。小さなオブジェクトのマークとスキャンのパフォーマンスが大幅に改善され、実世界のプログラムでガベージコレクションのオーバーヘッドが10-40%削減される見込みです。 :# encoding/json/v2パッケージ:GOEXPERIMENT=jsonv2で有効化可能。既存のencoding/jsonパッケージの大幅な改良版で、特にデコード性能が大幅に向上しています。 ; ランタイムの改善: :# コンテナ対応のGOMAXPROCS:LinuxでcgroupのCPU帯域幅制限を考慮し、論理CPU数よりも制限が低い場合はGOMAXPROCSを制限値に設定します。また、全OSでGOMAXPROCSを動的に更新する機能が追加されました。 :# トレースフライトレコーダー:runtime/trace.FlightRecorderAPIにより、インメモリリングバッファを使用した軽量な実行トレースキャプチャが可能になりました。 :# VMAアノテーション:Linux上でメモリマッピングに目的を示すアノテーション([anon: Go: heap]など)が付加されるようになりました。 ; コンパイラの改善: :# nilポインターチェックのバグ修正:Go 1.21で導入された、nilポインターチェックが不適切に遅延される問題が修正されました。 :# DWARF5サポート:デバッグ情報でDWARF5が使用され、バイナリサイズの削減とリンク時間の短縮を実現しました。 :# スライスの高速化:より多くの状況でスライスのバッキングストアをスタックに割り当てることが可能になり、パフォーマンスが向上しました。 ; ツールの改善: :# go buildのLeakDetection:-asanオプションでプログラム終了時にメモリリーク検出がデフォルトで有効になりました。 :# go.modのignoreディレクティブ:go commandが無視すべきディレクトリを指定できるようになりました。 :# go docの-httpオプション:ドキュメントサーバーを起動しブラウザで表示する機能が追加されました。 :# go version -m -json:バイナリファイルの BuildInfo構造体をJSON形式で出力できるようになりました。 :# 新しいvetアナライザー:waitgroup(WaitGroup.Addの誤用を検出)、hostport(IPv6で動作しないアドレス構築パターンを検出)が追加されました。 ; 標準ライブラリの改善: :# crypto系パッケージでMessageSignerインターフェースが追加され、メッセージ自身をハッシュ化するサイナーをサポート。 :# crypto/sha1でSHA-NIインストラクションによる2倍の高速化。 :# crypto/sha3でApple Mプロセッサーでの2倍の高速化とCloner実装。 :# crypto/tlsでConnectionState.CurveIDフィールドとGetEncryptedClientHelloKeysコールバックを追加。 :# net/httpでCrossOriginProtectionによるCSRF保護機能が追加。 :# os/WindowsでのNewFileがFILE''FLAG''OVERLAPPEDハンドルに対応し、非同期I/Oをサポート。 :# sync.WaitGroup.Goメソッドによりgoroutineの作成とカウントパターンが簡便化。 :# testing系パッケージでT.Attr、B.Attr、F.Attrメソッドによるテスト属性出力をサポート。 ; セキュリティの改善: :# FIPS 140-3モードでの改善:crypto/ecdsaとcrypto/ed25519での署名処理が4倍高速化。 :# TLS 1.2でSHA-1署名アルゴリズムがデフォルトで無効化({{RFC|9155}}準拠)。 :# crypto/x509でCreateCertificateがSHA-256を使用したSubjectKeyId生成を使用。 ; プラットフォームサポートの変更: :# macOS:macOS 12 Monterey以降が必要になりました(Go 1.24の予告通り)。 :# Windows:32-bit ARM(windows/arm)ポートはGo 1.25が最後のサポートバージョンとなり、Go 1.26で削除予定です。 :# linux/loong64:レースディテクターとCgoトレースバック、内部リンクモードでのcgoプログラムリンクに対応。 :# linux/riscv64:pluginビルドモードに対応。GORISCV64環境変数でrva23u64値をサポート。 Go 1.25では、パフォーマンス、セキュリティ、開発者体験の向上に重点が置かれ、特に実験的機能として提供される新しいガベージコレクターやJSON実装により、将来的なさらなるパフォーマンス向上の基盤が築かれています。 === Go 1.24 === Go 1.24が、2025年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.24 | title = Go 1.24 Release Notes - The Go Programming Language | date = 2025/02/11 | accessdate = 2025/02/23 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.24 | title = Go 1.24 is released! - The Go Programming Language | date = 2025/02/11 | accessdate = 2025/02/23 }}</ref>。 Go 1.24のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.24 Go 1.24 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.24 Go 1.24 is released! The Go Blog]}} ; 言語の変更点: :# ジェネリック型エイリアスが完全にサポートされるようになりました。これにより、型エイリアスに型パラメータを設定できるようになり、既存の型を制約付きで再定義することが可能になりました。たとえば <code>type VectorAlias[T any] = Vector[T]</code> のような定義ができます。この機能は Go 1.23 では実験的な機能(GOEXPERIMENT=aliastypeparams)でしたが、Go 1.24で正式にサポートされました。 ; 新しい標準パッケージ: :# crypto/mlkem:ML-KEM-768とML-KEM-1024を実装したパッケージ。 :# crypto/hkdf:HMAC-based Extract-and-Expand key derivation function (HKDF) を実装したパッケージ。 :# crypto/pbkdf2:password-based key derivation function (PBKDF2) を実装したパッケージ。 :# crypto/sha3:SHA-3ハッシュ関数とSHAKE/cSHAKE extendable-output functionsを実装したパッケージ。 :# weak:弱参照を提供するパッケージ。 :# testing/synctest:並行コードのテストをサポートする実験的なパッケージ(GOEXPERIMENT=synctestが必要)。 ; パフォーマンスの改善点: :# Swiss Tablesベースの新しいマップ実装により、2-3%のCPUオーバーヘッドが削減。 :# 小さなオブジェクトのメモリ割り当ての効率化。 :# 新しいランタイム内部ミューテックス実装。 ; ツールの改善: :# go.modファイルでツール依存関係を追跡できるようになりました。 :# go buildとgo installに -json フラグが追加され、構造化されたJSON出力が可能に。 :# go vetに新しいtestsアナライザーが追加され、テストの一般的な間違いを検出可能に。 ; セキュリティの改善: :# FIPS 140-3コンプライアンスのための新しいメカニズムが追加。 :# TLSサーバーがEncrypted Client Hello (ECH)をサポート。 :# RSAキーは1024ビット未満のキーサイズでエラーを返すように変更。 ; プラットフォームサポートの変更: :# Linuxはカーネルバージョン3.2以降が必要になりました。 :# Go 1.24はmacOS 11 Big Surをサポートする最後のバージョンとなります。 :# Windows 32-bit ARM (windows/arm)は「broken」とマークされました。 また、1.23でサポートされた"for-range"ループのイテレータ機能を活用し、bytes/stringsパッケージに新しいイテレータ関数(Lines、SplitSeq、SplitAfterSeq、FieldsSeq、FieldsFuncSeq)が追加されました。os.Root型による特定ディレクトリ内でのファイルシステム操作が可能になり、testing.B.Loopメソッドにより、ベンチマークの記述がより簡単で安全になっています。 === Go 1.23 === Go 1.23が、2024年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.23 | title = Go 1.23 Release Notes - The Go Programming Language | date = 2024/08/13 | accessdate = 2024/11/13 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.23 | title = Go 1.23 is released! - The Go Programming Language | date = 2024/08/13 | accessdate = 2024/11/13 }}</ref>。 Go 1.23のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.23 Go 1.23 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.23 Go 1.23 is released! The Go Blog]}} ; 言語の変更点: :# "for-range" ループでイテレータ関数がサポートされるようになりました。これにより、カスタムイテレーション値を生成する関数を使用できます。 :# ジェネリック型エイリアスのプレビューサポートが追加されました(GOEXPERIMENT=aliastypeparamsを有効にする必要があります)。 ; 新しい標準パッケージ: :# uniqueパッケージ:値の正規化(インターン化やハッシュコンス化)を行うための機能を提供します。 :# iterパッケージ:ユーザー定義のイテレータ機能を提供します。 :# structsパッケージ:構造体のメモリレイアウトなどのプロパティを制御する機能を提供します。 ; パフォーマンスの改善点: :# Profile Guided Optimization (PGO)のビルドオーバーヘッドが大幅に削減されました。以前は100%以上の増加が見られましたが、今回のリリースでは一桁台のパーセンテージまで改善されています。 :# コンパイラがローカル変数のスタックフレームスロットを最適化し、関数内の異なる領域で重複して使用できるようになり、スタック使用量が削減されました。 ; テレメトリーと開発者ツール: :# Goツールチェーンが使用状況と問題点の統計情報を収集できるテレメトリー機能が追加されました(オプトイン方式)。 :# go vetコマンドにstdversionアナライザーが追加され、使用しているGoバージョンと互換性のないシンボルの参照を検出できるようになりました。 ; プラットフォームサポートの変更: :# macOSは11 (Big Sur)以降が必要になりました。 :# Linux kernelは2.6.32以降が必要です(Go 1.24では3.2以降になる予定)。 :# OpenBSDの64-bit RISC-Vサポートが試験的に追加されました。 また、time.TimerとTime.Tickerの実装が大幅に改善され、未使用のタイマーがガベージコレクションの対象となるようになりました。セキュリティ面では、TLSクライアントがEncrypted Client Helloをサポートし、3DESの暗号スイートがデフォルトリストから削除されるなどの改善が行われています。 === Go 1.22 === Go 1.22が、2024年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.22 | title = Go 1.22 Release Notes - The Go Programming Language | date = 2024/02/06 | accessdate = 2024/02/11 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.22 | title = Go 1.22 is released! - The Go Programming Language | date = 2024/02/06 | accessdate = 2024/02/11 }}</ref>。 Go 1.22のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.22 Go 1.22 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.22 Go 1.22 is released! The Go Blog]}} ; 言語の変更点: :# 長らく問題視されてきた「for」ループの変数スコープが変更されました。以前は変数が一度だけ作成され、各イテレーションで更新されていましたが、Go 1.22以降は各イテレーションで新しい変数が作成されるようになり、意図しない共有の問題が解消されました。 :# 整数の範囲に対する<code>range</code>のサポートが追加されました。例えば、<code>for i := range 10</code>のような構文が可能になりました。 ; パフォーマンスの改善点: :# ガベージコレクションのメタデータを各ヒープオブジェクトの近くに配置するように最適化されました。これにより、CPUパフォーマンスが1-3%向上し、ほとんどのGoプログラムのメモリオーバーヘッドが約1%削減されました。 :# コンパイラのプロファイル誘導最適化(PGO)が改善され、より多くのインターフェースメソッド呼び出しの仮想化解除が可能になりました。代表的なGoプログラムの多くで、PGOを有効にすることで2-14%のパフォーマンス向上が見られます。 :# コンパイラは仮想化解除とインライン化を交互に行うようになり、インターフェースメソッド呼び出しの最適化が向上しました。 ; 標準ライブラリの追加と改善: :# 標準ライブラリで初めてのv2パッケージとなる<code>math/rand/v2</code>が追加されました。新しいパッケージでは、ChaCha8とPCGという2つの現代的な疑似乱数生成器を提供し、より高速なアルゴリズムを採用しています。 :# <code>net/http.ServeMux</code>のHTTPルーティングがより表現力豊かになりました。メソッドとワイルドカードをサポートし、例えば"POST /items/create"や"/items/{id}"のようなパターンが使用可能になりました。 :# <code>database/sql</code>パッケージに<code>Null[T]</code>型が追加され、任意の型のnullableカラムをスキャンする機能が提供されます。 :# <code>go/version</code>パッケージが追加され、Goバージョン文字列の検証と比較機能が提供されます。 :# <code>slices</code>パッケージに複数のスライスを連結する<code>Concat</code>関数が追加されました。 ; ツールの改善: :# Goコマンドでワークスペースのvendorディレクトリがサポートされるようになりました。<code>go work vendor</code>でディレクトリを作成し、<code>-mod=vendor</code>フラグで使用できます。 :# トレースツールのWebUIが改良され、スレッド指向のビューでトレースを探索できるようになりました。また、すべてのシステムコールの完全な実行時間が表示されるようになりました。 :# <code>go vet</code>ツールに新しい警告が追加され、appendに値を渡し忘れた場合や、time.Since呼び出しの遅延に関する問題を検出できるようになりました。 また、macOSのx86-64アーキテクチャ(darwin/amd64)向けのGoツールチェーンが、デフォルトで位置独立実行形式(PIE)を生成するようになりました。Go 1.23以降はmacOS 11 Big Sur以降が必要になることも発表されています。 === Go 1.21 === Go 1.21が、2023年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.21 | title = Go 1.21 Release Notes - The Go Programming Language | date = 2023/08/08 | accessdate = 2023-11-28 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.21 | title = Go 1.21 is released! - The Go Programming Language 5| date = 2023/08/08 | accessdate = 2023-11-28 }}</ref>。 {{Main|[https://go.dev/doc/go1.21 Go 1.21 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.21 Go 1.21 is released! The Go Blog]}} Go 1.21では、リリースの番号付けにわずかな変更が導入されました。Go 1.Nは、過去にGo言語のバージョン全体とリリースファミリー、およびそのファミリー内の最初のリリースを指すために使用されていました。しかし、Go 1.21から、最初のリリースはGo 1.N.0となりました。今日、Go 1.21言語とその初期実装であるGo 1.21.0リリースが公開されています。これらのノートは「Go 1.21」と呼ばれますが、go versionなどのツールは「go1.21.0」と報告されます(Go 1.21.1にアップグレードするまで)。 ; ツールの改善点: :# Profile Guided Optimization(PGO)機能が一般利用可能になりました。<code>default.pgo</code>という名前のファイルがメインパッケージのディレクトリにある場合、<code>go</code>コマンドはそれを使用してPGOビルドを有効にします。 :# <code>go</code>ツールは今後の言語の後方互換性と前方互換性をサポートします。 ; 言語の変更点: :# 新しい組み込み関数 <code>min</code>、<code>max</code>、<code>clear</code> が追加されました。 :# ジェネリック関数の型推論がいくつか改善され、仕様書の型推論の説明が拡張されました。 :# Goプログラミングの最も一般的な落とし穴の1つに取り組む予定で、そのプレビューがGo 1.21に含まれています。これは環境変数を使用してコードで有効にできます。詳細はLoopvarExperiment wikiページを参照してください。 ;標準ライブラリの追加点: :# 構造化ログのための新しいlog/slogパッケージが追加されました。 :# 任意の要素型のスライスに対する共通操作のための新しいslicesパッケージが追加されました。これには、一般的により高速で使いやすいソート関数も含まれています。 :# 任意のキーまたは要素型のマップに対する共通操作のための新しいmapsパッケージが追加されました。 :# 順序付けられた値を比較するための新しいユーティリティを提供するcmpパッケージが追加されました。 ; 性能の改善点: :# PGOを有効にした際のパフォーマンス向上に加えて、以下のような改善があります。 :# Goコンパイラ自体がPGOを有効にして再ビルドされ、ホストアーキテクチャによってはプログラムのビルドが2〜4%高速化されました。 :# ガベージコレクターの調整により、一部のアプリケーションではテールレイテンシーが最大40%削減される場合があります。 :# runtime/traceでトレースを収集する際のCPUコストが、amd64およびarm64で大幅に低減されました。 ; 新しいWASIポート: :# Go 1.21には、WebAssembly System Interface(WASI)の実験的なポートが追加されました(GOOS=wasip1、GOARCH=wasm)。 :# より一般的なWebAssembly(Wasm)コードの記述を容易にするために、コンパイラはWasmホストからの関数のインポートのための新しい指令 <code>go:wasmimport</code> をサポートしています。 === Go 1.20 === Go 1.20が、2023年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.20 | title = Go 1.20 Release Notes - The Go Programming Language | date = 2023/02/01 | accessdate = 2023-03-05 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.20 | title = Go 1.20 is released! - The Go Programming Language | date = 2023/02/01 | accessdate = 2023-03-05 }}</ref>。 {{Main|[https://go.dev/doc/go1.20 Go 1.20 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.20 Go 1.20 is released! The Go Blog]}} Go 1.20では、スライスから配列への変換が可能になりました。また、unsafeパッケージには新しい関数が追加され、スライスや文字列の値を構築および分解する完全な機能が提供されるようになりました。また、新しい仕様により、構造体のフィールドと配列の要素の比較が最初の不一致で停止するようになり、厳密に比較できない型引数を持つ型パラメータを使用して、比較制約に制限された型をインスタンス化することが可能になりました。 === Go 1.19 === Go 1.19が、2022年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.19 | title = Go 1.19 Release Notes - The Go Programming Language | date = 2022/08/02 | accessdate = 2022-08-04 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.19 | title = Go 1.19 is released! - The Go Programming Language | date = 2022/08/02 | accessdate = 2022-08-04 }}</ref>。 {{Main|[https://go.dev/doc/go1.19 Go 1.19 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.19 Go 1.19 is released! The Go Blog]}} Go 1.19では、ツールチェーン、ランタイム、およびライブラリの実装に変更が加えられています。言語にはわずかな修正があり、既存のプログラムには影響がないです。メモリモデルも更新され、C、C ++、Java、JavaScript、Rust、Swiftなどのメモリモデルに合わせられた。Go 1.19では、sync/atomicパッケージに新しい型が導入され、atomic.Int64やatomic.Pointer[T]などのatomic値をより簡単に使用できるようになっています。Go 1の互換性を維持しており、ほとんどのGoプログラムは引き続き従前どおりにコンパイルおよび実行されることが予想されます。 === Go 1.18 === Go 1.18が、2022年3月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.18 | title = Go 1.18 Release Notes - The Go Programming Language | date = 2022/03/10 | accessdate = 2022-08-04 }}</ref>。 {{Main|[https://go.dev/doc/go1.18 Go 1.18 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.18 Go 1.18 is released! The Go Blog]}} Go 1.18 には、型パラメータプロポーザル<ref>{{cite book | url=https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md | title=Type Parameters Proposal | accessdate=2021-09-30 }}</ref>で説明されたジェネリック機能の実装が含まれています。 以下は、最も目に付く変更点のリストです。 # 関数と型宣言の構文に型パラメータが使えるようになりました。⇒ [[/関数#ジェネリック関数]] # パラメータ化された関数や型は、その後に角括弧で型引数のリストを記述することでインスタンス化することができます。 # 新しいトークン <code>~</code> が演算子および区切子(punctuation)に追加されました。⇒ [[/字句的要素#演算子と区切子]] # インターフェイス型の構文では、任意の型(インターフェイスの型名だけでなく)、unionや~T型要素を埋め込むことができるようになりました。このようなインターフェースは、型制約としてのみ使用することができます。インターフェイスはメソッドと同様に型の集合を定義するようになりました。⇒ [[/型#インターフェース型]] # 新しい事前宣言された識別子<code>any</code>は空のインターフェースの別名です。これは <code>interface{} </code>の代わりに使用することができます。 # 新しい宣言済み識別子 <code>comparable</code> は <code>==</code> や <code>!=</code> を使って比較できる全ての型の集合を表すインターフェースです. ジェネリックを使った実験的なパッケージが3つあり、便利かもしれません。これらのパッケージは x/exp リポジトリにあります。これらのパッケージの API は Go 1 の保証の対象外であり、ジェネリックの経験を積むにつれて変更される可能性があります。 ;golang.org/x/exp/constraints :<code>constraints.Ordered</code>のようなジェネリックコードに便利な制約です。 ;golang.org/x/exp/slices :任意の要素タイプのスライス上で操作するジェネリック関数のコレクションです。 ;golang.org/x/exp/maps :任意のキーや要素タイプのマップ上で操作するジェネリック関数のコレクションです。 ---- Go 1.18は、言語、ツールチェーン、ランタイム、ライブラリに変更があり、互換性が保たれている。最大の変更点は、ジェネリックスの導入である。ジェネリックスはバックワード互換性があるが、実際に多くの人が書き、使用して初めて本番環境で十分にテストされる。ジェネリックスの使用は推奨されるが、本番環境で使用する場合は注意が必要である。ジェネリックスにはいくつかの制限があるが、これらは将来的に改善される可能性がある。これらの変更により、Goエコシステム全体に影響があり、完全なサポートには時間がかかるだろう。 === Go 1.17 === Go 1.17が、2021年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.17 | title = Go 1.17 Release Notes - The Go Programming Language | date = 2021/08/16 | accessdate = 2023-03-06 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.17 | title = Go 1.17 is released! - The Go Programming Language | date = 2021/08/16 | accessdate = 2023-03-06 }}</ref>。 {{Main|[https://go.dev/doc/go1.17 Go 1.17 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.17 Go 1.17 is released! The Go Blog]}} Go 1.17は、ツールチェーン、ランタイム、およびライブラリの実装の変更が中心で、ほとんどの変更は互換性が維持されています。言語自体には3つの小さな強化があり、スライスから配列ポインタへの変換、unsafe.Add、unsafe.Sliceが追加されました。このうち、スライスから配列ポインタへの変換が実行時にpanicを引き起こす場合があるため、タイプ変換が実行時にpanicを引き起こす可能性があることを考慮する必要があります。新しいプログラムを書く場合も、以前と同様に、unsafe.Pointerの安全ルールに従う必要があります。 === Go 1.16 === Go 1.16が、2021年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.16 | title = Go 1.16 Release Notes - The Go Programming Language | date = 2021/02/16 | accessdate = 2023-03-06 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.16 | title = Go 1.16 is released! - The Go Programming Language | date = 2021/02/16 | accessdate = 2023-03-06 }}</ref>。 {{Main|[https://go.dev/doc/go1.16 Go 1.16 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.16 Go 1.16 is released! The Go Blog]}} Go 1.16では、ツールチェーン、ランタイム、ライブラリの実装が変更されています。Go 1の互換性を維持しながら、ほとんどのプログラムが従来通りにコンパイルおよび実行できるようになっています。言語には変更はありません。 === Go 1.15 === Go 1.15が、2020年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.15 | title = Go 1.15 Release Notes - The Go Programming Language | date = 2020/08/11 | accessdate = 2023-03-12 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.15 | title = Go 1.15 is released! - The Go Programming Language | date = 2020/08/11 | accessdate = 2023-03-12 }}</ref>。 {{Main|[https://go.dev/doc/go1.15 Go 1.15 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.15 Go 1.15 is released! The Go Blog]}} Go 1.15では、リンカーの大幅な改良、高いコア数での小規模オブジェクトの割り当ての改善、X.509 CommonNameの非推奨化、そして新しい埋め込みtzdataパッケージの追加が含まれています。 === Go 1.14 === Go 1.14が、2020年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.14 | title = Go 1.14 Release Notes - The Go Programming Language | date = 2020/02/25 | accessdate = 2023-03-12 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.14 | title = Go 1.14 is released! - The Go Programming Language | date = 2020/02/25 | accessdate = 2023-03-12 }}</ref>。 {{Main|[https://go.dev/doc/go1.14 Go 1.14 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.14 Go 1.14 is released! The Go Blog]}} Go 1.14では、オーバーラップするインターフェースの提案により、埋め込まれたインターフェースで同じ名前とシグネチャを持つメソッドを許可するようになりました。しかし、インターフェース内で宣言されたメソッドは以前と同様にユニークである必要があります。 === Go 1.13 === Go 1.13が、2019年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.13 | title = Go 1.13 Release Notes - The Go Programming Language | date = 2019/09/03 | accessdate = 2023-03-12 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.13 | title = Go 1.13 is released! - The Go Programming Language | date = 2019/09/03 | accessdate = 2023-03-12 }}</ref>。 {{Main|[https://go.dev/doc/go1.13 Go 1.13 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.13 Go 1.13 is released! The Go Blog]}} Go 1.13では、数字リテラルの接頭辞が変更され、バイナリ整数、8進数整数、16進数浮動小数点数、虚数リテラル、数字区切りが使用できるようになりました。さらに、符号付きシフトカウントの制限が撤廃され、制限がなくなりました。これらの変更は、コンパイラの変更によって実現されました。Go 1.13を使用するには、go.modファイルで言語バージョンを指定する必要があります。 === Go 1.12 === Go 1.12が、2019年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.12 | title = Go 1.12 Release Notes - The Go Programming Language | date = 2019/02/25 | accessdate = 2024/11/13 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.12 | title = Go 1.12 is released! - The Go Programming Language | date = 2019/02/25 | accessdate = 2024/11/13 }}</ref>。 Go 1.12のリリースには、いくつかの新機能と改善が含まれ、Go言語のパフォーマンスやユーザビリティがさらに向上しました。以下が主な変更点です。 {{Main|[https://go.dev/doc/go1.12 Go 1.12 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.12 Go 1.12 is released! The Go Blog]}} ; 主要な新機能: :# Windows向けに、標準ライブラリがコントロールグループのサポートやシステムコールの改善により、性能向上と安定性が強化されました。 :# macOS向けの新しいサポートとして、ヒープメモリ使用量の削減や効率化が進められました。 ; パフォーマンスの改善点: :# 文字列操作の最適化が行われ、<code>strings.Trim</code>や<code>strings.Index</code>のパフォーマンスが向上しました。 :# 並列ガベージコレクションが改良され、メモリ管理の効率が向上しています。 :# コンパイラの境界チェックが一部のパターンで自動的に省略されるようになり、コード生成の効率がさらに向上しました。 ; デバッグ機能の改善: :# より正確な変数位置とスタック情報の提供により、デバッグ体験が改善されています。 :# 新たにDWARF生成の機能が拡充され、特に最適化コードにおいて、デバッグ情報の信頼性が高まりました。 ; ランタイムの改善: :# Windows上で、64ビットプロセスのアドレス空間使用が最適化され、より多くのメモリを使用可能になりました。 :# Goランタイムのシグナルハンドリングが強化され、システムシグナルの処理能力が向上しました。 ; 標準ライブラリの改善: :# <code>crypto/x509</code>パッケージで、証明書の検証がmacOSのシステム証明書ストアを使用するようになり、macOSでの信頼性が向上しました。 :# <code>net/http</code>において、HTTP/2の接続管理が改善され、特に大量接続環境での安定性が増しました。 :# <code>os</code>パッケージの<code>Process.Signal</code>がWindowsでも利用可能となり、Windows上のプロセス管理機能が強化されました。 ; ツールの改善: :# <code>go test</code>コマンドに<code>-json</code>フラグが追加され、テスト結果をJSON形式で出力できるようになりました。 :# goコマンドが<code>go.sum</code>ファイルを自動的に更新し、依存関係の信頼性が向上しています。 :# <code>gofmt</code>において、特定のコードパターンの整形が改良され、より一貫したコードスタイルが保たれます。 また、OpenBSD 6.4以降、macOS 10.11 El Capitan以降、またはWindows 7以降が必要となり、これらのOSの以前のバージョンのサポートが終了しました。リリースノートでは、Go 1の互換性は維持されており、ほとんどのGoプログラムは以前と同様に動作すると述べられています。 === Go 1.11 === Go 1.11が、2018年8月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.11 | title = Go 1.11 Release Notes - The Go Programming Language | date = 2018/08/24 | accessdate = 2024/11/13 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.11 | title = Go 1.11 is released! - The Go Programming Language | date = 2018/08/24 | accessdate = 2024/11/13 }}</ref>。 Go 1.11のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.11 Go 1.11 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.11 Go 1.11 is released! The Go Blog]}} ; 主要な新機能: :# モジュールサポートの実験的な導入により、GOPATHに依存しない開発が可能になりました。バージョン管理と依存関係管理が統合され、より信頼性の高いビルドが実現できます。 :# WebAssembly(js/wasm)の実験的なポートが追加され、syscall/jsパッケージを通じてJavaScriptとの連携が可能になりました。 :# RISCVアーキテクチャ向けのGOARCH値("riscv"と"riscv64")が予約されました。 ; パフォーマンスの改善点: :# マップのクリア操作が最適化され、<code>for k := range m { delete(m, k) }</code>のようなコードが効率的に実行されるようになりました。 :# スライス拡張の<code>append(s, make([]T, n)...)</code>が最適化されました。 :# コンパイラの境界チェックと分岐除去が大幅に改善され、より効率的なコードが生成されるようになりました。 ; デバッグ機能の改善: :# 最適化されたバイナリのデバッグ情報が大幅に改善され、変数位置情報、行番号、ブレークポイント位置がより正確になりました。 :# DWARFセクションがデフォルトで圧縮されるようになりました。 :# デバッガー内からのGo関数呼び出しが実験的にサポートされました。 ; ランタイムの改善: :# スパースヒープレイアウトの採用により、Goヒープサイズの制限(従来は512GiB)が撤廃されました。 :# macOSとiOSで、カーネルの直接呼び出しの代わりにlibSystem.dylibを使用するように変更され、将来のOSバージョンとの互換性が向上しました。 ; 標準ライブラリの改善: :# <code>crypto/cipher</code>パッケージに、非標準のタグ長をサポートするGCM実装が追加されました。 :# <code>net/http</code>の<code>Transport</code>型に、ホストごとの最大接続数を制限する<code>MaxConnsPerHost</code>オプションが追加されました。 :# <code>os</code>パッケージに、ユーザー固有のキャッシュディレクトリを取得する<code>UserCacheDir</code>関数が追加されました。 ; ツールの改善: :# 環境変数<code>GOFLAGS</code>が導入され、goコマンドのデフォルトフラグを設定できるようになりました。 :# godocのWebサーバーが、APIの新機能がどのGoバージョンで導入されたかを表示するようになりました。 また、OpenBSD 6.2以降、macOS 10.10 Yosemite以降、またはWindows 7以降が必要となり、これらのOSの以前のバージョンのサポートが終了しました。リリースノートでは、Go 1の互換性は維持されており、ほとんどのGoプログラムは以前と同様に動作すると述べられています。 ---- === Go 1.10 === Go 1.10が、2018年2月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.10 | title = Go 1.10 Release Notes - The Go Programming Language | date = 2018/02/16 | accessdate = 2025/05/20 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.10 | title = Go 1.10 is released - The Go Programming Language | date = 2018/02/16 | accessdate = 2025/05/20 }}</ref>。 Go 1.10のリリースでは、開発体験を大幅に向上させる複数の重要な改善が含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.10 Go 1.10 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.10 Go 1.10 is released! The Go Blog]}} ; ビルドシステムの大幅改善: :# ビルドキャッシュの導入により、最近ビルドしたパッケージが自動的にキャッシュされ、ビルド時間が大幅に短縮されました。 :# テスト結果のキャッシュ化により、変更のないテストは再実行せずにキャッシュされた結果を使用するようになりました。 :# <code>go test</code>時に<code>go vet</code>が自動実行され、テスト前にコードの問題を検出できるようになりました。 :# <code>go install</code>コマンドが、コマンドラインで指定されたパッケージのみをインストールするように変更されました。 ; cgoのセキュリティ強化と機能拡張: :# cgoの<code>#cgo CFLAGS</code>などで指定できるコンパイラオプションが安全なもののみに制限され、<code>-fplugin</code>などの危険なオプションは使用できなくなりました。 :# Go文字列値へのC言語からの直接アクセスが可能になり、<code>_GoString_</code>型、<code>_GoStringLen</code>、<code>_GoStringPtr</code>関数が追加されました。 :# CのtypedefがGoの型エイリアスとして実装され、<code>C.X</code>と<code>C.Y</code>を相互に使用できるようになりました。 ; パフォーマンスの改善点: :# ガベージコレクタが割り当て遅延への影響を軽減するよう改善されました。 :# コンパイラの最適化によりコード生成品質が向上し、サポートされている全アーキテクチャで性能が向上しました。 :# スタックトレースから暗黙のラッパー関数(<code><autogenerated></code>マーク)が除外され、より読みやすくなりました。 ; ツールの改善: :# <code>go doc</code>コマンドが、型Tを返すスライスや*Tを返す関数も型Tの表示に含めるようになりました。 :# <code>go test</code>に<code>-failfast</code>フラグが追加され、テスト失敗時に残りのテストを停止できるようになりました。 :# <code>go test -json</code>フラグが追加され、機械読み取り可能なJSON形式でテスト結果を出力できるようになりました。 :# <code>go get</code>コマンドでFossilソースコードリポジトリがサポートされました。 ; ランタイムの改善: :# <code>LockOSThread</code>と<code>UnlockOSThread</code>の呼び出しがネストをサポートするようになりました。 :# <code>GOMAXPROCS</code>の制限が撤廃されました(以前は1024が上限)。 :# <code>GOROOT</code>関数が、環境変数が設定されていない場合にプログラムのコンパイル時の値を使用するようになりました。 ; 標準ライブラリの改善: :# <code>strings</code>パッケージに新しい<code>Builder</code>型が追加され、文字列構築時のメモリ効率が向上しました。 :# <code>math</code>パッケージに<code>Round</code>、<code>RoundToEven</code>、<code>Erfinv</code>、<code>Erfcinv</code>関数が追加されました。 :# <code>net/url</code>の<code>ResolveReference</code>が複数の先頭スラッシュを保持するように修正され、{{RFC|3986}}に準拠しました。 :# <code>bytes</code>パッケージの<code>Fields</code>、<code>Split</code>系関数が、返すサブスライスの容量を長さと同じに設定するようになり、メモリ効率が向上しました。 :# <code>archive/tar</code>と<code>archive/zip</code>でより多くのヘッダー形式や時刻エンコーディングがサポートされました。 ; デバッグ機能の改善: :# バイナリ内のDWARFデバッグ情報が改善され、定数値の記録、より正確な行番号情報、パッケージ単位でのコンパイル単位の表現が実現されました。 :# 各種ビルドモードがより多くのシステムに対応し、<code>c-shared</code>、<code>pie</code>、<code>plugin</code>モードの対応プラットフォームが拡張されました。 ; アセンブラの拡張: :# ARM 32ビット、ARM 64ビット、PowerPC 64ビット、S390X、X86 64ビットアーキテクチャで多数の新しい命令がサポートされました。 :# 特にX86 64ビットでは、AVX、AVX2、BMI、BMI2、F16C、FMA3、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2などの拡張命令セットを含む359の新命令が追加されました。 ; ソースコードフォーマットの変更: :# <code>gofmt</code>のデフォルトフォーマットに軽微な変更があり、3つのインデックスを持つスライス式と単一行のインターフェースリテラルの表示が改善されました。 === Go 1.9 === Go 1.9が、2017年8月にリリースされました<ref>{{cite web | url = https://go.dev/doc/go1.9 | title = Go 1.9 Release Notes - The Go Programming Language | accessdate = 2025-05-20 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.9 | title = Go 1.9 is released - The Go Blog | date = 2017/08/24 | accessdate = 2025-05-20 }}</ref>。 Go 1.9のリリースでは、言語、ツール、ランタイム、標準ライブラリに多くの変更と改善が含まれています。主な変更点は以下の通りです。 {{Main|[https://go.dev/doc/go1.9 Go 1.9 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.9 Go 1.9 is released - The Go Blog]}} ; 言語の変更点: :# 型エイリアス: パッケージ間で型を移動する際などに、段階的なコードの修正をサポートするための型エイリアスが導入されました。 :#:<code>type T1 = T2</code> :#:の形式で宣言することで、既存の型 T2 に別の名前 T1 を与えることができます。 :# 浮動小数点演算の融合: 言語仕様が更新され、実装が浮動小数点演算(例えば、積和演算)を融合することが許可される条件が定義されました。中間結果の丸めを強制したい場合は、float64(x*y) + z のように明示的な型変換が必要です。 ; 新しい標準パッケージ: :# math/bits: 符号なし整数のビット操作(カウント、操作など)のための最適化された実装を提供する新しいパッケージが追加されました。可能な場合、CPUの特殊な命令が利用されます。 ; パフォーマンスの改善点: :# 並列コンパイル: パッケージ内の関数のコンパイルが並列化され、マルチコア環境でのビルド時間が改善されました。この機能はデフォルトで有効ですが、環境変数 GO19CONCURRENTCOMPILATION=0 を設定することで無効にできます。 :# ガベージコレクション: ストップザワールド型のガベージコレクションを引き起こしていたライブラリ関数 (runtime.GC, debug.SetGCPercent, debug.FreeOSMemory) が、呼び出し元のゴルーチンのみをブロックする並行ガベージコレクションに変更されました。 ; ツールの改善: :# Vendorディレクトリのマッチング: go test などのパッケージ名を引数に取るツールにおいて、./... が vendor ディレクトリ内のパッケージをマッチしなくなりました。vendor ディレクトリをマッチさせるには、./vendor/.... を使用する必要があります。 :# GOROOTの移動: go tool は、実行されたパスからGoのインストールツリーのルートを特定するようになりました。これにより、Goのインストールディレクトリ全体を移動した場合でも、go tool が通常通り動作するはずです。 :# go test -list: テスト、ベンチマーク、またはExampleの名前を正規表現でフィルタリングしてリスト表示する -list フラグが go test コマンドに追加されました。 :# go env -json: 環境変数をJSON形式で出力する -json フラグが go env コマンドに追加されました。 ; その他の注目すべき変更点: :# sync.Map: 並行アクセスに対応した新しいマップ型 sync.Map が追加されました。読み込み、書き込み、削除操作は償却定数時間で行われます。 :# testing.Helper: testing.T および testing.B に Helper メソッドが追加されました。このメソッドを呼び出すと、エラー報告などでファイル名と行番号が表示される際に、ヘルパー関数自身ではなく、ヘルパー関数を呼び出した箇所の情報が表示されるようになります。 :# timeパッケージ: time パッケージは、各 Time 値に透過的に単調時間(monotonic time)を追跡するようになり、壁時計の調整があっても二つの Time 値間の経過時間を安全に計算できるようになりました。 :# runtime.CallersFrames: インライン化されたフレームを含むコールスタックの情報を正確に取得するために、runtime.Callers の結果を直接検査するのではなく、runtime.CallersFrames を使用することが推奨されるようになりました。 :# runtime/pprof: runtime/pprof パッケージで生成されるプロファイルにシンボル情報が含まれるようになり、プロファイルを生成したバイナリなしで go tool pprof で表示できるようになりました。また、プロファイルレコードにラベルを追加する機能も追加されました。 Go 1.9には、上記以外にも多くの追加、改善、および修正が含まれています。詳細については、公式のリリースノートを参照してください。 === Go 1.8 === Go 1.8が、2017年2月にリリースされました<ref>{{cite web | url = https://go.dev/doc/go1.8 | title = Go 1.8 Release Notes - The Go Programming Language | accessdate = 2025-05-20 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.8 | title = Go 1.8 is released - The Go Blog | date = 2017/02/16 | accessdate = 2025-05-20 }}</ref>。 Go 1.8のリリースでは、ツールチェーン、ランタイム、およびライブラリの実装に多くの変更が含まれています。主な変更点は以下の通りです。 {{Main|[https://go.dev/doc/go1.8 Go 1.8 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.8 Go 1.8 is released - The Go Blog]}} ; 言語の変更点: :# '''構造体型の変換:''' Go 1.8以降、構造体間の明示的な型変換において、タグが無視されるようになりました。タグのみが異なる2つの構造体は、相互に変換可能です。 :# '''浮動小数点定数の指数:''' 言語仕様が更新され、実装が浮動小数点定数で最大16ビットの指数をサポートすることが要求されるようになりました。ただし、"gc" と gccgo コンパイラは、どちらも32ビットの指数をサポートしています。 ; ポート: :# '''32-bit MIPSのサポート:''' Linux上で、big-endian (linux/mips) と little-endian (linux/mipsle) の両方のマシンで、FPUまたはカーネルFPUエミュレーションを備えたMIPS32r1命令セットを実装する32-bit MIPSがサポートされるようになりました。 ; ツール: :# '''アセンブラ:''' 64-bit x86システム用に、VBROADCASTSD, BROADCASTSS, MOVDDUP, MOVSHDUP, MOVSLDUP, VMOVDDUP, VMOVSHDUP, VMOVSLDUPなどの命令が追加されました。 :# '''Yacc:''' yaccツールは削除されました。 :# '''Fix:''' fixツールに、"golang.org/x/net/context" から "context" へimportを変更する "context" fixが追加されました。 :# '''Pprof:''' pprofツールは、"https+insecure" URLスキームを使用して、TLSサーバーをプロファイルし、証明書の検証をスキップできるようになりました。 :# '''Trace:''' traceツールに、実行トレースからpprof互換のブロッキングおよびレイテンシプロファイルを生成するための -pprof フラグが追加されました。 :# '''Vet:''' Vetは、いくつかの点でより厳密になり、以前に誤検出を引き起こしていた箇所ではより緩くなりました。 ; コンパイラツールチェーン: :# '''SSAバックエンド:''' 64-bit x86システム用の新しいコンパイラバックエンドが導入されました。このバックエンドは、よりコンパクトで効率的なコードを生成し、境界チェックの排除などの最適化のためのより良いプラットフォームを提供します。 :# '''コンパイラとリンカの最適化:''' コンパイラとリンカが最適化され、Go 1.7よりも高速に実行されるようになりました。 ; Cgo: :# Goツールは、make.bash中に設定されたCGO_ENABLED環境変数の値を記憶し、デフォルトですべての将来のコンパイルに適用するようになりました。 ; デフォルトのGOPATH: :# GOPATH環境変数が設定されていない場合、デフォルト値を持つようになりました。Unixでは$HOME/go、Windowsでは%USERPROFILE%/goがデフォルトです。 ; Go get: :# "go get"コマンドは、-insecureフラグが使用されているかどうかに関係なく、HTTPプロキシ環境変数を常に尊重するようになりました。 ; Go bug: :# 新しい "go bug" コマンドは、現在のシステムに関する情報が事前に入力された状態で、GitHubでバグレポートを開始します。 ; Go doc: :# "go doc" コマンドは、godocの動作に従い、定数と変数をその型でグループ化するようになりました。 ; プラグイン: :# Goは、Goで記述されたプラグインを生成するための "plugin" ビルドモードと、実行時にそのようなプラグインをロードするための新しい plugin パッケージによる、プラグインの初期サポートを提供するようになりました。 ; ランタイム: :# '''引数の活性:''' ガベージコレクタは、関数全体の引数をライブとは見なしなくなりました。 :# '''並行マップの誤用:''' Go 1.6で、マップの並行誤用の軽量でベストエフォートな検出が追加されました。このリリースでは、マップへの並行書き込みと反復処理を行うプログラムの検出がサポートされ、その検出器が改善されました。 ; パフォーマンス: :# ガベージコレクションの一時停止が大幅に短縮され、通常は100マイクロ秒未満、多くの場合10マイクロ秒程度になりました。 :# deferred関数呼び出しのオーバーヘッドが約半分に削減されました。 :# GoからCへの呼び出しのオーバーヘッドが約半分に削減されました。 ; 標準ライブラリ: :# '''Examples:''' 多くのパッケージに例が追加されました。 :# '''Sort:''' sortパッケージに、less関数を指定してスライスをソートするための便利な関数Sliceが含まれるようになりました。 :# '''HTTP/2 Push:''' net/httpパッケージに、HandlerからHTTP/2サーバープッシュを送信するメカニズムが含まれるようになりました。 :# '''HTTPサーバーの正常シャットダウン:''' HTTPサーバーは、新しいServer.Shutdownメソッドを使用した正常シャットダウンと、新しいServer.Closeメソッドを使用した突然のシャットダウンをサポートするようになりました。 :# '''コンテキストのサポート:''' context.Contextの標準ライブラリへの採用を継続し、Go 1.8は、既存のパッケージへのコンテキストサポートを追加しました。 :# '''Mutex競合プロファイリング:''' ランタイムとツールが、競合するmutexのプロファイリングをサポートするようになりました。 Go 1.8には、上記以外にも多くの追加、改善、および修正が含まれています。詳細については、公式のリリースノートを参照してください。 === Go 1.7 === Go 1.7が、2016年8月にリリースされました<ref>{{cite web | url = https://go.dev/doc/go1.7 | title = Go 1.7 Release Notes - The Go Programming Language | accessdate = 2025-05-20 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.7 | title = Go 1.7 is released - The Go Blog | date = 2016/08/15 | accessdate = 2025-05-20 }}</ref>。 主な変更点は以下の通りです。 ; 主な変更点 * '''言語仕様''': 終了ステートメントの定義を明確化(既存の挙動を正式化) * '''パフォーマンス''': x86-64向け新しいコンパイラバックエンドで5-35%の性能向上 * '''標準ライブラリ''': ** <code>context</code>パッケージが標準ライブラリに昇格 ** <code>net/http/httptrace</code>パッケージ追加 ** テスト階層構造をサポート(サブテスト/サブベンチマーク) * '''ツールチェーン''': ** ビルド時間の改善 ** バイナリサイズの削減(20-30%減少することも) ** ベンダリングサポートが正式機能に * '''ポート''': ** macOS 10.12 Sierraサポート追加 ** Linux on z Systems(s390x)の実験的サポート追加 ; 互換性 Go 1の互換性保証を維持。ほとんどのGoプログラムは変更なしで動作する見込み。 ; その他の注目点 * ガベージコレクションの一時停止時間が短縮 * 多数の標準ライブラリで10%以上の性能改善 * Unicode 9.0サポート * WindowsでのメモリOS返還サポート * 実行トレースの収集オーバーヘッドが大幅改善(400%→25%) このリリースは主にツールチェーン、ランタイム、ライブラリの実装改善に焦点を当てています。 === Go 1.6 === Go 1.6が、2016年2月17日にリリースされました<ref>{{cite web | url = https://go.dev/blog/go1.6 | title = Go 1.6 Release Notes - The Go Programming Language | accessdate = 2025-06-29 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.6 | title = Go 1.6 is released - The Go Blog | date = 2016/02/17 | accessdate = 2025-06-29 }}</ref>。 主な変更点は以下の通りです。 ; 主な変更点 * '''言語仕様''': 言語仕様の変更なし * '''パフォーマンス''': ** Go 1ベンチマークスイートのプログラムが平均数パーセント高速化 ** ガベージコレクターの一時停止時間がさらに短縮(特にメモリを大量に使用するプログラムで) ** <code>compress/bzip2</code>、<code>compress/gzip</code>、<code>crypto/aes</code>、<code>crypto/elliptic</code>、<code>crypto/ecdsa</code>、<code>sort</code>パッケージで10%以上の最適化 ** <code>sort.Sort</code>の実装が効率化され、約10%高速化 * '''標準ライブラリ''': ** <code>net/http</code>パッケージがHTTPS使用時にHTTP/2を透過的かつ自動的にサポート ** <code>text/template</code>パッケージにテンプレート再利用の新メカニズムを追加(アクション周りの空白除去、<code>{{block}}</code>アクション) * '''ツールチェーン''': ** パーサーがyacc生成のものから手書きのものに変更 ** <code>linux/amd64</code>向けにClang MemorySanitizerとの連携のための新しい<code>-msan</code>フラグを追加 ** リンカーに新しい<code>-libgcc</code>オプションを追加 ** Go 1.5で導入されたビルドモードを多くのシステムに拡張(<code>c-shared</code>、<code>shared</code>、新しい<code>pie</code>モード) ** <code>go</code>コマンドがベンダリングをデフォルトで有効化(Go 1.5では実験的機能) ** <code>go doc</code>コマンドの曖昧性解消を改善(ベンダリングされたコピーよりも元のパッケージを優先) ** <code>go vet</code>コマンドが関数やメソッドの値を<code>Printf</code>に誤って渡す診断を開始 * '''ポート''': ** 64ビットMIPS上のLinuxと32ビットx86上のAndroidへの実験的な新しいポートを追加 ; 互換性 Go 1の互換性保証を維持。ほとんどのGoプログラムは変更なしでコンパイルおよび実行される見込み。 ; その他の注目点 * ランタイムでマップの同時誤用を軽量に検出(検出された場合はプログラムがクラッシュ) * プログラム終了時のパニックについて、ランタイムがデフォルトで実行中のゴルーチンのスタックのみを出力 * Goのガベージコレクターとの互換性を確保するため、GoポインタとCコード間の共有ルールを明確化し、強制 * Windowsでのグローバルタイマー解像度の1ms強制を停止 * <code>-buildmode=c-archive</code>または<code>-buildmode=c-shared</code>でビルドされたアーカイブおよび共有ライブラリのシグナルハンドリングを変更 * <code>reflect</code>パッケージで、エクスポートされたフィールドを含む埋め込まれた非エクスポート構造体型に関する非互換性を解決 === Go 1.5 === Go 1.5が、2015年8月19日にリリースされました<ref>{{cite web | url = https://go.dev/blog/go1.5 | title = Go 1.5 Release Notes - The Go Programming Language | accessdate = 2025-06-29 }}</ref><ref>{{cite web | url = https://go.dev/blog/go1.5 | title = Go 1.5 is released - The Go Blog | date = 2015/08/19 | accessdate = 2025-06-29 }}</ref>。 主な変更点は以下の通りです。 ; 主な変更点 * '''言語仕様''': ** マップリテラルの要素型の省略を許可する構文の制限が緩和 * '''パフォーマンス''': ** ガベージコレクターが再設計され、並行処理可能に。一時停止時間が劇的に短縮され、通常10ミリ秒未満に ** スケジューラーの改善により、<code>GOMAXPROCS</code>のデフォルト値が論理CPU数に変更 * '''標準ライブラリ''': ** <code>flag</code>パッケージでよりクリーンな使用法メッセージ ** <code>math/big</code>に任意精度浮動小数点数用の新しい<code>Float</code>型を追加 ** LinuxおよびBSDシステム上のDNSリゾルバーの改善により、名前ルックアップのcgo要件を削除 ** <code>go/types</code>パッケージが標準ライブラリに移動 ** <code>reflect</code>パッケージに<code>ArrayOf</code>および<code>FuncOf</code>関数が追加 * '''ツールチェーン''': ** コンパイラとランタイムが完全にGoで記述され、GoコードベースからすべてのCコードが削除 ** 従来のツール名(例: <code>6g</code>、<code>8g</code>)が廃止され、<code>go tool compile</code>、<code>go tool asm</code>、<code>go tool link</code>などの単一バイナリに置き換え ** 中間オブジェクトファイルが<code>.6</code>、<code>.8</code>などの代わりに<code>.o</code>サフィックスを使用 ** <code>go/types</code>パッケージの移動に伴い、<code>vet</code>および<code>cover</code>ツールも移動 ** コンパイラが定数評価に<code>math/big</code>パッケージを使用 ** アセンブラが新しいネイティブGo実装になり、わずかな互換性変更あり ** リンカーに拡張されたリンクスタイル(共有ライブラリのビルドなど)のための<code>-buildmode</code>オプションを導入 ** <code>go tool vet</code>コマンドが構造体タグのより厳密な検証を実行 ** <code>go test</code>コマンドに新しい<code>-count</code>フラグ、<code>go generate</code>に<code>-run</code>オプションと新しい環境変数を追加 ** <code>go get</code>コマンドに新しい<code>-insecure</code>フラグを追加 ** 外部依存関係の「ベンダリング」に対する実験的なサポートが導入(<code>go</code>コマンドが有効化) * '''ポート''': ** Snow Leopardおよび<code>dragonfly/386</code>のサポートが終了 ** <code>darwin/arm</code>、<code>darwin/arm64</code>(AppleのiPhoneおよびiPad用)、<code>linux/arm64</code>、<code>ppc64</code>、<code>ppc64le</code>(IBM 64ビットPowerPC)を含む新しいポートがソースから利用可能 ** FreeBSD (8-STABLE以上) およびNaCl (SDKバージョンpepper-41) の特定の要件 ** Solarisポートで完全な<code>cgo</code>サポートと<code>net</code>および<code>crypto/x509</code>の改善 ; 互換性 主要なアーキテクチャ変更にもかかわらず、Go 1の互換性保証を維持。ほとんどのGoプログラムは以前と同様にコンパイルおよび実行される見込み。ただし、ゴルーチンスケジューリング順序に暗黙的に依存するプログラムや、複数のコアでの実行を想定していないプログラム(<code>GOMAXPROCS</code>のデフォルト値変更のため)は更新が必要になる場合がある。 ; その他の注目点 * 内部パッケージのサポートがすべてのリポジトリで提供 * <code>install</code>サブコマンドがソースディレクトリに<code>build</code>によって作成されたバイナリを削除 * 新しいビルドオプションとして<code>-asmflags</code>、<code>-buildmode</code>、<code>-pkgdir</code>、<code>-toolexec</code>が追加 * <code>-ccflags</code>オプションが削除 === Go 1.4 === Go 1.4が、2014年12月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.4 | title = Go 1.4 Release Notes - The Go Programming Language | date = 2014/12/10 | accessdate = 2025/05/20 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.4 | title = Go 1.4 is released - The Go Programming Language | date = 2014/12/10 | accessdate = 2025/05/20 }}</ref>。 Go 1.4は、Go 1.3から約半年後のリリースとなり、プロジェクトの歴史において「実装のクリーンアップ」と「将来のプラットフォームへの布石」となる重要なバージョンです。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.4 Go 1.4 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.4 Go 1.4 is released! The Go Blog]}} ; 言語の変更点: :# '''for-rangeループの簡略化''':ループ変数を必要としない場合に、変数名を省略して <code>for range s { ... }</code> と記述できるようになりました。 :# '''メソッド呼び出しの厳格化''':ポインタではないレシーバを持つメソッドを、二重ポインタ(<code>**T</code>)から直接呼び出すことが禁止されました。 ; 新しいプラットフォームのサポート: :# '''Androidのサポート''':<code>GOOS=android</code>、<code>GOARCH=arm</code> が追加されました。これにより、Goで書かれたライブラリをAndroidアプリ(Java/Kotlin)から呼び出すための基盤が整いました。 :# '''ARM64の実験的サポート''':将来の64ビットARMプロセッサを見据え、<code>linux/arm64</code> のサポートが開始されました。 ; ツールの改善: :# '''go generateコマンドの導入''':ソースコード内のコメント(<code>//go:generate ...</code>)をスキャンしてコード生成ツールを実行する新しいサブコマンドが追加されました。これにより、<code>stringer</code> などのツールを用いたメタプログラミングが容易になりました。 :# '''ビルド速度の改善''':コンパイラの一部がCからGoへ書き換えられ始めた過渡期であり、ツールチェーン全体の整理が進められました。 ; ランタイムの改善: :# '''スタック管理の変更''':連続スタック(contiguous stacks)の導入により、以前の「セグメントスタック」で発生していた「ホットスプリット問題(スタックの拡張と縮小が頻発してパフォーマンスが低下する現象)」が解消されました。 :# '''ガベージコレクタの改良''':ガベージコレクションの並行処理化に向けた準備として、ランタイムの内部構造が大幅に再設計されました。 ; 標準ライブラリの改善: :# '''contextパッケージの萌芽''':この時期、<code>golang.org/x/net/context</code> パッケージが開発され、Google内部で広く使われ始めました(後にGo 1.7で標準ライブラリ入りします)。 :# '''OSインターフェースの拡充''':<code>os</code> パッケージや <code>net</code> パッケージにおいて、システムリソースへのアクセス効率が向上しました。 Go 1.4は、Go言語が誕生以来使用してきたC言語による実装から、Go自身でGoをコンパイルする「セルフホスティング」へと移行するための重要なステップとなりました。 === Go 1.3 === Go 1.3が、2014年6月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.3 | title = Go 1.3 Release Notes - The Go Programming Language | date = 2014/06/18 | accessdate = 2025/05/19 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.3 | title = Go 1.3 is released - The Go Programming Language | date = 2014/06/18 | accessdate = 2025/05/19 }}</ref>。 Go 1.3は、Go 1.2から約半年後のリリースとなり、言語仕様自体の変更を含まない一方で、「ランタイムの大幅なパフォーマンス向上」と「ツールチェーンの再設計・近代化」に深く焦点を当てた重要なバージョンです。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.3 Go 1.3 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.3 Go 1.3 is released! The Go Blog]}} ; 言語の変更点: :# '''仕様変更なし''':Go 1互換性ガイドラインに基づき、言語仕様自体への変更や追加はありません。既存のソースコードはそのまま完全にコンパイル可能です。 ; 新しいプラットフォームのサポート: :# '''Solarisのサポート''':<code>GOOS=solaris</code>、<code>GOARCH=amd64</code> が追加され、SolarisおよびIllumosベースのシステムが公式にサポートされました。 :# '''Plan 9のサポート改善''':<code>GOOS=plan9</code> において、AMD64アーキテクチャ(<code>GOARCH=amd64</code>)のサポートが追加されました。 :# '''Native Client (NaCl) の拡張''':Googleの安全なコード実行環境であるNative Clientにおいて、従来のx86(32ビット/64ビット)に加えてARMアーキテクチャ(<code>GOARCH=arm</code>)がサポートされました。 ; ツールの改善: :# '''リンカーとコンパイラの再構成''':C言語で書かれていた従来のツールチェーン(<code>6g</code>、<code>6l</code> など)を、Go言語自身で書き換える(セルフホスティング)ための前段階として、リンカーの内部構造を分割・整理する基礎工作が行われました。 :# '''godocの静的解析機能''':<code>godoc</code> に高度な静的解析機能(型分析、コールグラフ、メソッドセットの表示など)が統合され、コードブラウジングが強力になりました。 :# '''go testの機能拡張''':<code>go test -cpu</code> フラグで複数のCPUカウントをカンマ区切りで指定できるようになり、異なる並行度でのテストが容易になりました。また、ベンチマーク中のメモリアロケーション統計(<code>-benchmem</code>)がデフォルトで強化されました。 ; ランタイムの改善: :# '''スタック管理の変更(スタックコピーの導入)''':従来の「セグメントスタック(分割スタック)」方式から、必要に応じて新しいメモリ領域を確保してスタック全体を丸ごとコピーする「スタックコピー(後に連続スタックへと繋がる基盤)」方式へ移行が始まりました。これにより、スタック境界で関数呼び出しが繰り返される際のオーバーヘッドが激減しました。 :# '''正確なガベージコレクション(Precise GC)の進展''':ガベージコレクタがさらに精密化され、スタック上のポインタと非ポインタ(整数など)を完全に区別できるようになりました。これにより、誤ってメモリが保持され続ける「メモリリーク(浮遊ポインタ問題)」が解消され、ヒープサイズが縮小しました。 ; 標準ライブラリの改善: :# '''sync.Poolの導入''':ガベージコレクションの負荷を軽減するため、割り当て済みのオブジェクトを再利用するための並行安全なキャッシュ機構 <code>sync.Pool</code> が追加されました。高性能なネットワークサーバーなどの実装で劇的な効果を発揮します。 :# '''パフォーマンスの最適化''':<code>crypto/x509</code>、<code>fmt</code>、<code>net</code>、<code>os</code>、<code>reflect</code> などの主要パッケージでリファクタリングが行われ、多くのアロケーションが削減されたことで、実行速度が全体的に大幅に向上しました。 Go 1.3は、目に見える新機能こそ控えめですが、ランタイムの足腰を徹底的に鍛え上げ、次期バージョン(Go 1.4)以降で本格化する「コンパイラの100% Go言語化(セルフホスティング)」および「完全並行GC」へと向かうための、極めて強固なバイパス(土台)を築いたリリースです。 === Go 1.2 === Go 1.2が、2013年12月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.2 | title = Go 1.2 Release Notes - The Go Programming Language | date = 2013/12/01 | accessdate = 2025/05/20 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.2 | title = Go 1.2 is released - The Go Programming Language | date = 2013/12/01 | accessdate = 2025/05/20 }}</ref>。 Go 1.2は、Go 1.1のリリースから約半年後に提供され、言語仕様への細かな利便性の向上、開発ツールの強力なアップグレード、そしてランタイムのさらなる安定化をもたらしたバージョンです。互換性を維持しつつ、日々の開発体験を向上させる実用的な変更が多く含まれています。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.2 Go 1.2 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.2 Go 1.2 is released! The Go Blog]}} ; 言語の変更点: :# '''3引数スライス(スライス容量の制御)''':スライス式において、従来の <code>s[i:j]</code> に加え、3つ目の引数を指定する <code>s[i:j:k]</code> という構文(3-index slices)が導入されました。これにより、得られる部分スライスの容量(<code>cap</code>)を最大 <code>k</code> までに制限できるようになり、サブスライスへの追加操作(<code>append</code>)が意図せず元配列の背後にあるメモリを上書きしてしまうリスクを安全に排除できるようになりました。 ; 新しいプラットフォームのサポート: :# '''特定のアーキテクチャへの特記なし''':既存のOS(Linux、Mac OS X、FreeBSD、Windowsなど)およびアーキテクチャ(amd64、386、arm)への最適化とバグ修正が中心であり、新しいOSターゲットの追加はこのバージョンでは行われませんでした。 ; ツールの改善: :# '''テストカバレッジツールの導入(go test -cover)''':<code>go test</code> コマンドに <code>-cover</code> フラグが追加され、コードのテストカバレッジを測定できるようになりました。これに伴い、新ツール <code>go tool cover</code> が提供され、どのコードパスが実行され、どのパスが実行されていないかをブラウザ上で色分けして視覚的に確認できるHTMLレポートの生成が可能になりました。 :# '''go testの並行実行制御''':<code>go test</code> に <code>-cpu</code> フラグの動作が調整されたほか、複数パッケージのテストを並行して実行するための <code>-p</code> フラグの挙動が洗練されました。 ; ランタイムの改善: :# '''ゴルーチンのプリエンプション(協調的スケジューリングの強化)''':ランタイムのスケジューラが拡張され、関数呼び出しのタイミングで自動的にプリエンプション(実行権の譲渡)チェックが挟まれるようになりました。これにより、タイトなループを実行し続ける特定のゴルーチンが1つのスレッドを占有し続け、他のゴルーチンやガベージコレクション(GC)の呼び出しを停止させてしまう問題(飢餓状態)が大幅に緩和されました。 :# '''スレッド制限の導入''':デフォルトで1つのプログラムが作成できるオペレーティングシステム(OS)のスレッド数が最大10,000個に制限されました(<code>runtime/debug.SetMaxThreads</code> で変更可能)。これは、無限にスレッドが生成されてシステム全体のメモリを枯渇させる暴走バグを防ぐための安全策です。 ; 標準ライブラリの改善: :# '''imageパッケージの刷新''':<code>image</code> および <code>image/color</code> パッケージにいくつかの新しいインターフェースと、パフォーマンス向上のためのピクセル精度の最適化が施されました。 :# '''多くのパッケージでの最適化''':<code>compress/bzip2</code>、<code>encoding/json</code>、<code>net</code> などの主要パッケージで、不要なアロケーションの削減やアルゴリズムのブラッシュアップが行われ、実行効率が向上しました。 Go 1.2は、仕様を大きく変えることなく、3引数スライスによる「堅牢性の向上」や、カバレッジツールによる「品質管理の容易化」、そしてスケジューラ改善による「並行処理の安定化」を確実にもたらしました。地味ながらも、プロダクション環境での信頼性を引き上げる確実な一歩となったリリースです。 === Go 1.1 === Go 1.1が、2013年5月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.1 | title = Go 1.1 Release Notes - The Go Programming Language | date = 2013/05/13 | accessdate = 2025/05/19 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.1 | title = Go 1.1 is released - The Go Programming Language | date = 2013/05/13 | accessdate = 2025/05/19 }}</ref>。 Go 1.1は、2012年3月のGo 1.0リリース以来、初めてのメジャーアップデートとなります。Go 1の「互換性約束(Compatibility Guarantee)」を厳格に守りつつ、コミュニティからのフィードバックを反映して、パフォーマンスの大幅な向上、言語仕様の洗練、そして開発ツールの強化が図られました。最も注目すべき変更点は以下です。 {{Main|[https://go.dev/doc/go1.1 Go 1.1 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.1 Go 1.1 is released! The Go Blog]}} ; 言語の変更点: :# '''メソッド値(Method Values)の導入''':オブジェクトのメソッドを、レシーバ(そのオブジェクト自身)を束縛した状態の関数値として直接取り出せるようになりました。たとえば、f := obj.Method と記述して、後から f() として呼び出すことが可能です。これにより、イベントハンドラやコールバックの記述が非常に簡潔になりました。 :# '''戻り値の要件の厳格化(および合理化)''':値を返す関数において、制御フローの末尾(terminate statement)に return がない場合のコンパイラチェックが厳密になりました。一方で、panic や無限ループで終わるパスなど、明らかに終端に到達しないコードベースでは return を省略できるよう仕様が整理されました。 :# '''整数除算のゼロ除算のランタイムエラー化''':定数ではない変数によるゼロ除算(x / 0)が、コンパイル時だけでなく実行時にも一貫してランタイムパニックを発生させるよう挙動が統一されました。 ; 新しいプラットフォームのサポート: :# '''ARMアーキテクチャのサポート強化''':GOARCH=arm において、浮動小数点演算のハードウェアアクセラレーション(GOARM=7 など)の対応が進み、Raspberry Piなどの組み込みデバイスでの実行速度が飛躍的に向上しました。 :# '''プラットフォームの実験的追加''':freebsd/arm や netbsd/386 などの新しいOS・アーキテクチャの組み合わせへの移植が開始されました。 ; ツールの改善: :# '''goコマンドの機能拡充''':go get や go test などのサブコマンドが大幅に強化されました。特に、他のリポジトリの依存関係の処理がスムーズになり、並行してテストを実行する仕組みが洗練されました。 :# '''レースディテクタ(Race Detector)の搭載''':データ競合(Data Race)を検出するための強力なツール -race フラグが go test、go run、go build に導入されました(ThreadSanitizerをバックエンドに使用)。並行処理プログラムにおいて、複数のゴルーチンが同期なしに同じメモリにアクセスする潜在的バグを自動で暴き出すことができます。 :# '''vetツールの標準化''':コードの静的解析を行い、ミス(Printf のフォーマット指定子の間違いなど)を検出する go vet コマンドが正式にツールチェーンに統合されました。 ; ランタイムの改善: :# '''パフォーマンスの劇的な向上(GCとスケジューラ)''':メモリ割り当て(アロケータ)の効率化、およびガベージコレクタ(GC)のマップ処理の最適化により、多くのプログラムで数10%〜2倍以上の高速化を達成しました。 :# '''新スケジューラ(G-M-Pモデル)への刷新''':ランタイムのゴルーチンスケジューラが全面的に書き換えられました。これまでの単一のグローバルロックによるボトルネックが解消され、複数CPUコア(GOMAXPROCS)を有効にしたマルチスレッド環境における並行処理のスケール性能が爆発的に向上しました。 ; 標準ライブラリの改善: :# '''netパッケージの刷新''':ネットワーク接続のタイムアウト処理や非同期I/Oのバックエンドが刷新され、より高負荷な通信を安定して捌けるようになりました。 :# '''新規パッケージの追加''':文字列やバイト列の効率的なプールを提供する bytes.Buffer の見直しや、データ構造を扱う各種内部パッケージの最適化が行われました。 Go 1.1は、最初のリリースで確立された「安定性」という土台の上に、プロダクション環境で戦うための「圧倒的な速度」と「バグを撃退する強力なツール(レースディテクタ)」を実装した、Go言語の進化において最もエキサイティングなマイルストーンの1つです。 === Go 1.0 === Go 1.0が、2012年3月にリリースされました<ref>{{cite book | url = https://go.dev/doc/go1.0 | title = Go 1.3 Release Notes - The Go Programming Language | date = 2012/03/28 | accessdate = 2025/05/19 }}</ref><ref>{{cite book | url = https://go.dev/blog/go1.0 | title = Go 1.0 is released - The Go Programming Language | date = 2012/03/28 | accessdate = 2025/05/19 }}</ref>。 Go 1.0は、2009年のオープンソース化以来、数年間にわたる活発な開発とコミュニティからのフィードバックを経て到達した、Goプロジェクト史上初の「安定版(Major Stable Release)」です。最大の特徴は、企業や開発者がプロダクション環境で安心して採用できるよう、将来にわたるソースコードの互換性を保証する「Go 1 互換性約束(Compatibility Guarantee)」が確立された点にあります。最も注目すべき変更点と仕様の確定は以下です。{{Main|[https://go.dev/doc/go1.0 Go 1.0 Release Notes - The Go Programming Language]|[https://go.dev/blog/go1.0 Go 1.0 is released! The Go Blog]}} ; 言語の確定と変更点: :# '''互換性の保証(Go 1の約束)''':Go 1.0で記述された標準仕様に準拠するソースコードは、将来のGo 1.x系バージョンにおいても修正なしでコンパイルでき、同じ動作をすることが保証されました。これにより、言語仕様の頻繁な変更に追われるリスクが解消されました。 :# '''新しい型システムと複素数''':complex64 および complex128 が組み込み型として完全に統合されました。また、エラー表現のための標準的なインターフェースとして error 型が導入され、従来の os.Error から置き換えられました。 :# '''マップとスライスのリテラル形式の洗練''':複合リテラル(Composite Literals)の記述において、要素の型を明示的に反復しなくても推論できるケースが増え、コードがより簡潔に記述できるようになりました。 ; プラットフォームのサポート: :# '''OSとアーキテクチャの公式サポート''':Linux(386/amd64/arm)、Mac OS X(Darwin 386/amd64)、FreeBSD(386/amd64)、およびWindows(386/amd64)が、第1級の市民として公式サポート対象となりました。 ; ツールの標準化: :# '''goコマンド(go tool)の誕生''':従来の 6g、6l、make、gotest、goinstall といったバラバラだったコンパイル・ビルド・パッケージ管理・テスト用のツール群が、すべて単一の go コマンド(go build, go install, go test, go get など)に統合されました。これにより、Makefileなしで依存関係を自動解決してビルドする近代的な開発環境が完成しました。 :# '''コードフォーマッタ(gofmt)の確定''':コードの自動整形ツール gofmt の挙動が公式スタイルとして固定され、コミュニティ全体で一貫した読みやすいコードベースを維持する文化が決定づけられました。 :# '''移行ツール(go fix)の提供''':週次ビルドや古いプレリリース(r60など)のコードを、Go 1.0の標準仕様へ自動的に書き換えるための go fix ツールが提供され、スムーズな移行が促されました。 ; ランタイムとメモリの改善: :# '''ガベージコレクタとスケジューラの基本設計''':並行処理を安全に行うためのゴルーチン(Goroutines)のスケジューリング機構、およびヒープメモリの自動管理を行うガベージコレクタ(GC)が、安定稼働を最優先とした第1世代の設計として統合されました。 ; 標準ライブラリの再編成: :# '''ディレクトリ構造の大規模な整理''':初期の雑多なパッケージ配置が見直され、現在の net/http、encoding/json、crypto といった論理的でクリーンな階層構造へと徹底的に再構成されました。 :# '''一貫したAPIデザイン''':すべてのパッケージにおいて、関数の命名規則(大文字開始によるエクスポート)や、エラーを関数の最後の戻り値((result, error))として返すシグネチャの統一が完了しました。 Go 1.0は、一言語のリリースにとどまらず、「言語仕様」「標準ツールチェーン」「標準ライブラリ」が三位一体となり、後方互換性を強く宣言したことで、Go言語が実験的なプロジェクトから、世界規模のクラウドインフラやバックエンドシステムを支える実用言語へと本格的に羽ばたくための不朽の原点となりました。 == Go1.0前史 == Goが2012年3月にメジャー安定版である「Go 1.0」として結実するまでには、約4年半にわたる「知的な実験」と「過酷な試行錯誤」の歴史(前史)が存在します。 UNIXやC言語、Plan 9を生み出した伝説的なエンジニアたちが、Googleという巨大なインフラの中で直面した課題を解決するために始めたプロジェクト――それがGoの始まりでした。 === 1. プロジェクトの誕生と動機(2007年) === Goプロジェクトは、'''2007年9月21日'''、Googleのエンジニアであった'''ロバート・グリースマー(Robert Griesemer)'''、'''ロブ・パイク(Rob Pike)'''、'''ケン・トンプソン(Ken Thompson)'''の3人によるホワイトボードの前での議論から始まりました。 彼らが共有していたのは、当時のソフトウェア開発環境、特にGoogle内部で主流だったC++による大規模システム開発に対する強い「不満」と「危機感」でした。 * '''ハードウェアの進化との乖離''': コンピュータはマルチコア化し、大規模なクラスタで動作する時代になっていたにもかかわらず、C++やJavaなどの言語はシングルコア時代の設計を引きずっており、並行処理(Concurrency)の記述が非常に複雑でエラーを誘発しやすかったこと。 * '''ビルド時間の爆発''': Googleの超巨大なコードベースをC++でビルドすると、ヘッダーファイルの依存関係の複雑さから、コンパイルに数時間から数日を要する「ビルド待ち時間」が発生し、開発効率を著しく低下させていたこと。 * '''言語の肥大化と認知負荷''': 言語に機能(パラダイム)が追加され続けることで複雑化し、他人が書いたコードを理解するコストが跳ね上がっていたこと。 彼らは「'''システムプログラミング言語が持つべき『効率性・静的型付けの安全性』と、動的言語(PythonやJavaScriptなど)が持つ『開発の手軽さ・俊敏さ』を高い次元で融合させた、21世紀のインフラのための新しい言語'''」を求めたのです。 === 2. 黎明期の設計と実装(2008年) === 2008年初頭、言語のプロトタイプ作成が本格化します。この時期に、現在のGoの根幹をなす特徴的な機能が次々と形作られていきました。 * '''コンパイラの着手''': ケン・トンプソンが、自身のUNIX時代の知見を活かしてC言語で独自のコンパイラ群(後にx86向けに <code>6g</code>、<code>6l</code> などと呼ばれるツールチェーン)を書き始めました。 * '''C言語ライクからの脱却''': 当初はC言語の純粋な拡張として構文を検討していましたが、宣言の記述順序(型を後ろに書く <code>x int</code> 形式)の変更や、セミコロンの自動挿入、暗黙の型変換の禁止など、クリーンで厳格な構文へと舵を切りました。 * '''インターフェースと並行処理の融合''': ロバート・グリースマーによる構造的型付け(Structural Typing)に基づく「明示的な宣言を必要としないインターフェース」の設計、そしてロブ・パイクによるPlan 9(NewsqueakやAlef)の知見をベースにした「チャネル(Channels)とゴルーチン(Goroutines)による通信」のアイデアが組み込まれました。 この年、コンパイラ開発の専門家であるイアン・ランス・テイラー(Ian Lance Taylor)'''がプロジェクトに参加し、GCCのフロントエンドとして <code>gccgo</code> の開発を開始。これにより、Goの設計が特定のコンパイラ実装に依存しない汎用的なものであることが証明されました。また、後にGoの主要開発者となる'''ラサ・コックス(Russ Cox)も加わり、ランタイムや標準ライブラリの整備が急速に進みます。 === 3. オープンソース化(2009年11月) === '''2009年11月10日'''、Goは世界に向けてオープンソースプロジェクトとして電撃的に発表されました。 当初は「Googleがまた新しい言語を作った」という好奇の目で見られましたが、その極端なシンプルさとコンパイルの圧倒的な速さは、初期の目の肥えたハッカーたちを魅了しました。 しかし、オープンソース化直後のGo(いわゆる「プレGo 1.0」時代)は、現在のモダンなGoからは想像もつかないほど激動の、そして「毎週のようにコードが壊れる」過酷な開発環境でした。 === 4. ウィークリービルド(Weekly)とリリース(R)の時代(2009年 - 2011年) === Go 1.0がリリースされるまでの約2年間、公式の安定版というものは存在せず、開発は <code>weekly</code>(週次ビルド)および <code>release</code>(r56, r60 など)というバージョン名で刻まれていました。 この時代の主な特徴と混乱は以下の通りです。 ==== ① 頻繁な言語仕様の変更(破壊的変更) ==== 言語のコア機能や組み込み関数が、毎週のように追加・削除・変更されました。 * '''<code>closed</code> から <code>panic</code> へ''': 当初、チャネルが閉じられたかどうかを検知する組み込み関数 <code>closed()</code> がありましたが、後に削除され、現在の <code>v, ok := <-ch</code> 形式へ統合されました。 * '''<code>map</code> のアクセス構文''': マップにキーが存在するかを調べる構文も二転三転し、一時は専用のビルトイン関数が検討されたこともありました。 * '''新しいキーワードの追加と廃止''': メモリ割り当ての <code>new</code> と <code>make</code> の役割分担の整理や、初期にあった特殊な制御構文のスクラップ・アンド・ビルドが繰り返されました。 ==== ② ばらばらのツールチェーン ==== 当時はまだ <code>go</code> コマンドがありませんでした。開発者は以下のような手順を手動(またはMakefile)で行っていました。 * x86-64環境であれば、コンパイルには <code>6g</code>、リンクには <code>6l</code> コマンドを直接叩く。 * 32ビットx86であれば <code>8g</code> / <code>8l</code>、ARMであれば <code>5g</code> / <code>5l</code> を使う。 * パッケージのインストールには <code>goinstall</code>、テストには <code>gotest</code> という別個のスクラップスクリプトが使われており、プロジェクトのビルド管理は非常に煩雑でした。 ==== ③ 標準ライブラリの未成熟と「os.Error」 ==== 現在おなじみの <code>error</code> インターフェース(組み込み型)は存在せず、<code>os</code> パッケージの中に <code>os.Error</code> という型として定義されていました。このため、文字通りあらゆるパッケージが <code>os</code> パッケージに依存するという、不健全な依存構造(循環参照のリスク)を抱えていました。 === 5. 「Go 1」へのカウントダウンと大掃除(2011年後半) === 世界中で徐々にGoが本番環境(初期のCloudflareやSoundCloudなど)で使われ始めるにつれ、「毎週のように仕様が変わり、アップデートするたびにコードが動かなくなる言語は、企業のシステムでは怖くて使えない」という悲鳴が上がりました。 これを受けたコア開発チームは、言語を広く普及させるためには'''「一切の破壊的変更を止め、後方互換性を永久に保証するマイルストーン」'''が必要であると決断します。これが'''「Go 1 共同宣言(Go 1 Release Planning)」'''です。 2011年後半から2012年3月にかけて、チームは「最後の大掃除」に着手しました。 * '''<code>os.Error</code> から 組み込みの <code>error</code> への格上げ''': 依存関係をクリーンにするため、言語自体の組み込み型として <code>error</code> インターフェースを再定義しました。 * '''パッケージの統廃合''': 雑多に広がっていた標準ライブラリ(<code>container/vector</code> の廃止、<code>os/signal</code> への整理など)のレイアウトを徹底的にリファクタリングしました。 * '''<code>go</code> コマンドの誕生''': ラサ・コックスらにより、バラバラだったコンパイル環境を1つに統合する <code>go</code> コマンドが設計され、Makefileが不要なモダンなビルドエコシステムが完成しました。 * '''<code>go fix</code> の提供''': これまで毎週の破壊的変更に苦しんできた世界中の開発者のために、古いプレリリースのソースコードを自動的に「Go 1.0 仕様」へと一括置換・修正してくれる救済ツール(<code>go fix</code>)が開発されました。 === そして「原点」へ === 2012年3月28日、すべての仕様が凍結され、未来永劫の互換性を誓った'''Go 1.0'''が正式にリリースされました。 カオスに満ちた4年半の「前史」で流された無数のリファクタリングの血と、UNIXの巨匠たちがこだわった「引き算の美学(不要な機能を入れない)」があったからこそ、Goは今日に至るまで「10年前のコードが今でもそのまま動く」という、圧倒的な安定性と信頼性を手に入れることができたのです。 == 脚註 == <references /> == 参考文献 == *{{cite book | url = https://go.dev/ref/spec | title = The Go Programming Language Specification | date = JJune 13, 2024 | publisher = The Go website }} == 下位階層のページ == *[[Go/&^]] *[[Go/0]] *[[Go/0.0]] *[[Go/:=]] *[[Go/=]] *[[Go/Cross-package inlining]] *[[Go/Cのif-elseのエラーパターン解消に関するGoの選択]] *[[Go/EBNF]] *[[Go/Goのコードでgoのバージョンを調べる方法]] *[[Go/Goのプログラムがどんなアセンブリにコンパイルされるか?]] *[[Go/Goコンパイラの変遷]] *[[Go/HTTP]] *[[Go/Hypot]] *[[Go/Keywords]] *[[Go/Mid-stack inlining]] *[[Go/Predeclared identifiers]] *[[Go/Size class]] *[[Go/Standard library]] *[[Go/Standard library/errors]] *[[Go/Standard library/fmt]] *[[Go/Standard library/os]] *[[Go/Zero value]] *[[Go/analysis]] *[[Go/any]] *[[Go/append]] *[[Go/bool]] *[[Go/break]] *[[Go/byte]] *[[Go/cap]] *[[Go/case]] *[[Go/cgoでGoのコードからCの関数を利用する]] *[[Go/chan]] *[[Go/clear]] *[[Go/close]] *[[Go/comparable]] *[[Go/complex]] *[[Go/complex128]] *[[Go/complex64]] *[[Go/const]] *[[Go/continue]] *[[Go/copy]] *[[Go/core type]] *[[Go/default]] *[[Go/defer]] *[[Go/defer,panicとrecover]] *[[Go/delete]] *[[Go/else]] *[[Go/else if]] *[[Go/error]] *[[Go/fallthrough]] *[[Go/false]] *[[Go/flag]] *[[Go/float32]] *[[Go/float64]] *[[Go/for]] *[[Go/func]] *[[Go/go]] *[[Go/go.mod]] *[[Go/go.work]] *[[Go/gofmtコマンド]] *[[Go/goto]] *[[Go/goコマンド]] *[[Go/goコマンド/bug]] *[[Go/goコマンド/build]] *[[Go/goコマンド/clean]] *[[Go/goコマンド/doc]] *[[Go/goコマンド/env]] *[[Go/goコマンド/fix]] *[[Go/goコマンド/fix/any]] *[[Go/goコマンド/fix/bloop]] *[[Go/goコマンド/fix/buildtag]] *[[Go/goコマンド/fix/errorsastype]] *[[Go/goコマンド/fix/fmtappendf]] *[[Go/goコマンド/fix/forvar]] *[[Go/goコマンド/fix/hostport]] *[[Go/goコマンド/fix/inline]] *[[Go/goコマンド/fix/mapsloop]] *[[Go/goコマンド/fix/minmax]] *[[Go/goコマンド/fix/newexpr]] *[[Go/goコマンド/fix/omitzero]] *[[Go/goコマンド/fix/plusbuild]] *[[Go/goコマンド/fix/rangeint]] *[[Go/goコマンド/fix/reflecttypefor]] *[[Go/goコマンド/fix/slicescontains]] *[[Go/goコマンド/fix/slicessort]] *[[Go/goコマンド/fix/stditerators]] *[[Go/goコマンド/fix/stringsbuilder]] *[[Go/goコマンド/fix/stringscut]] *[[Go/goコマンド/fix/stringscutprefix]] *[[Go/goコマンド/fix/stringsseq]] *[[Go/goコマンド/fix/testingcontext]] *[[Go/goコマンド/fix/waitgroup]] *[[Go/goコマンド/fmt]] *[[Go/goコマンド/generate]] *[[Go/goコマンド/get]] *[[Go/goコマンド/help]] *[[Go/goコマンド/install]] *[[Go/goコマンド/list]] *[[Go/goコマンド/mod]] *[[Go/goコマンド/run]] *[[Go/goコマンド/telemetry]] *[[Go/goコマンド/test]] *[[Go/goコマンド/tool]] *[[Go/goコマンド/tool/addr2line]] *[[Go/goコマンド/tool/asm]] *[[Go/goコマンド/tool/cgo]] *[[Go/goコマンド/tool/compile]] *[[Go/goコマンド/tool/covdata]] *[[Go/goコマンド/tool/covdata/debugdump]] *[[Go/goコマンド/tool/covdata/func]] *[[Go/goコマンド/tool/covdata/intersect]] *[[Go/goコマンド/tool/covdata/merge]] *[[Go/goコマンド/tool/covdata/percent]] *[[Go/goコマンド/tool/covdata/pkglist]] *[[Go/goコマンド/tool/covdata/subtract]] *[[Go/goコマンド/tool/covdata/textfmt]] *[[Go/goコマンド/tool/cover]] *[[Go/goコマンド/tool/dist]] *[[Go/goコマンド/tool/link]] *[[Go/goコマンド/tool/nm]] *[[Go/goコマンド/tool/objdump]] *[[Go/goコマンド/tool/pack]] *[[Go/goコマンド/tool/pprof]] *[[Go/goコマンド/tool/preprofile]] *[[Go/goコマンド/tool/test2json]] *[[Go/goコマンド/tool/trace]] *[[Go/goコマンド/version]] *[[Go/goコマンド/vet]] *[[Go/goコマンド/vet/appends]] *[[Go/goコマンド/vet/asmdecl]] *[[Go/goコマンド/vet/assign]] *[[Go/goコマンド/vet/atomic]] *[[Go/goコマンド/vet/bools]] *[[Go/goコマンド/vet/buildtag]] *[[Go/goコマンド/vet/cgocall]] *[[Go/goコマンド/vet/composites]] *[[Go/goコマンド/vet/copylocks]] *[[Go/goコマンド/vet/defers]] *[[Go/goコマンド/vet/directive *[[Go/goコマンド/vet/errorsas]] *[[Go/goコマンド/vet/framepointer]] *[[Go/goコマンド/vet/hostport]] *[[Go/goコマンド/vet/httpresponse]] *[[Go/goコマンド/vet/ifaceassert]] *[[Go/goコマンド/vet/loopclosure]] *[[Go/goコマンド/vet/lostcancel]] *[[Go/goコマンド/vet/nilfunc]] *[[Go/goコマンド/vet/printf]] *[[Go/goコマンド/vet/shift]] *[[Go/goコマンド/vet/sigchanyzer]] *[[Go/goコマンド/vet/slog]] *[[Go/goコマンド/vet/stdmethods]] *[[Go/goコマンド/vet/stdversion]] *[[Go/goコマンド/vet/stringintconv]] *[[Go/goコマンド/vet/structtag]] *[[Go/goコマンド/vet/testinggoroutine]] *[[Go/goコマンド/vet/tests]] *[[Go/goコマンド/vet/timeformat]] *[[Go/goコマンド/vet/unmarshal]] *[[Go/goコマンド/vet/unreachable]] *[[Go/goコマンド/vet/unsafeptr]] *[[Go/goコマンド/vet/unusedresult]] *[[Go/goコマンド/vet/waitgroup]] *[[Go/goコマンド/work]] *[[Go/goコマンド/work/init]] *[[Go/if]] *[[Go/imag]] *[[Go/import]] *[[Go/int]] *[[Go/int16]] *[[Go/int32]] *[[Go/int64]] *[[Go/int8]] *[[Go/interface]] *[[Go/iota]] *[[Go/iter.Seq版エラトステネスの篩]] *[[Go/len]] *[[Go/make]] *[[Go/map]] *[[Go/max]] *[[Go/min]] *[[Go/named type]] *[[Go/new]] *[[Go/nil]] *[[Go/os/Args]] *[[Go/package]] *[[Go/panic]] *[[Go/print]] *[[Go/println]] *[[Go/range]] *[[Go/real]] *[[Go/recover]] *[[Go/return]] *[[Go/rune]] *[[Go/select]] *[[Go/string]] *[[Go/struct]] *[[Go/switch]] *[[Go/true]] *[[Go/type]] *[[Go/type literal]] *[[Go/uint]] *[[Go/uint16]] *[[Go/uint32]] *[[Go/uint64]] *[[Go/uint8]] *[[Go/uintptr]] *[[Go/underlying type]] *[[Go/var]] *[[Go/イテレータ]] *[[Go/エラー]] *[[Go/キーワードと宣言済み識別子]] *[[Go/クロスコンパイル]] *[[Go/コードギャラリー]] *[[Go/ジェネリクス]] *[[Go/ソースコードの表現方法]] *[[Go/パッケージ]] *[[Go/ファイル入出力]] *[[Go/ブロック・宣言とスコープ]] *[[Go/プログラムの初期化と実行]] *[[Go/ポインタ]] *[[Go/マップ]] *[[Go/メソッド]] *[[Go/メソッドとインターフェース]] *[[Go/メソッドチェイン]] *[[Go/メモリアロケータ]] *[[Go/ユーザー定義型の配列とスライス]] *[[Go/並行処理]] *[[Go/主要な標準インターフェース]] *[[Go/修飾子不要なインライン関数展開]] *[[Go/再帰的関数呼出し]] *[[Go/型]] *[[Go/型と値の特性]] *[[Go/変数]] *[[Go/字句的要素]] *[[Go/定数と変数]] *[[Go/実行の方法]] *[[Go/宣言済型]] *[[Go/宣言済定数]] *[[Go/宣言済識別子]] *[[Go/宣言済関数]] *[[Go/式]] *[[Go/改廃された技術]] *[[Go/数リテラルの精度と型]] *[[Go/文]] *[[Go/文法の概要]] *[[Go/条件分岐と繰り返し]] *[[Go/構造体]] *[[Go/標準ライブラリー]] *[[Go/環境構築]] *[[Go/算術演算と数学関数]] *[[Go/識別子のスコープ]] *[[Go/配列とスライス]] *[[Go/配列とスライスとエスケープ解析]] *[[Go/関数]] == 外部リンク == {{Wikipedia|Go (プログラミング言語)|Go}} {{Wikiversity|Topic:Go|Go}} * [https://go.dev/ The Go Programming Language] - 公式サイト * [https://go.dev/play/ The Go Playground] * [https://golang.design/gossa The Go SSA Playground] {{DEFAULTSORT:GO}} [[Category:Go|*]] [[Category:プログラミング言語]] {{NDC|007.64}} 5fd3bi3ahc544myn31giz8a78w4iv7m Go/Goのプログラムがどんなアセンブリにコンパイルされるか? 0 32613 305174 276366 2026-10-30T00:45:06Z Ef3 694 校閲と推敲 305174 wikitext text/x-wiki {{Nav}} = Goのプログラムがどんなアセンブリにコンパイルされるか? = Goは簡素化された構文とキャッシュの使用により、非常に高速にコンパイルされますが、(中間コードではなく)ネイティブな機械語を生成します。 では、実際にどのようなコードが生成されるかを検証してみましょう。 == Hello, World を逆アセンブル == ;[https://play.golang.org/p/X0_wfzwyj-E hello.go]:<syntaxhighlight lang=go copy> package main import "fmt" func main() { fmt.Println("Hello, World") } </syntaxhighlight> 上のような単純で完全なプログラム hello.go を用意します。 :<syntaxhighlight lang=shell> % go build hello.go </syntaxhighlight> : <code>hello</code>にコンパイル結果が出力されます。 : go tool objdump という Go の逆アセンブラーは、実効形式を理解できます(-S はソースも併せて表示するオプションです)。 :<syntaxhighlight lang=shell> % go tool objdump -S -s main.main hello > hello.objdump </syntaxhighlight> ;hello.objdump:<syntaxhighlight lang=c-objdump> TEXT main.main(SB) /home/user1/tut/go/hello.go func main() { 0x4941a0 493b6610 CMPQ SP, 0x10(R14) 0x4941a4 7645 JBE 0x4941eb 0x4941a6 55 PUSHQ BP 0x4941a7 4889e5 MOVQ SP, BP 0x4941aa 4883ec38 SUBQ $0x38, SP fmt.Println("Hello, World") 0x4941ae 488d15eba00b00 LEAQ 0xba0eb(IP), DX 0x4941b5 4889542428 MOVQ DX, 0x28(SP) 0x4941ba 488d15f79e0000 LEAQ 0x9ef7(IP), DX 0x4941c1 4889542430 MOVQ DX, 0x30(SP) return Fprintln(os.Stdout, a...) 0x4941c6 488b1d3b220d00 MOVQ os.Stdout(SB), BX 0x4941cd 488d058c7b0c00 LEAQ 0xc7b8c(IP), AX 0x4941d4 488d4c2428 LEAQ 0x28(SP), CX 0x4941d9 bf01000000 MOVL $0x1, DI 0x4941de 89fe MOVL DI, SI 0x4941e0 e85baaffff CALL fmt.Fprintln(SB) } 0x4941e5 4883c438 ADDQ $0x38, SP 0x4941e9 5d POPQ BP 0x4941ea c3 RET func main() { 0x4941eb e87035feff CALL runtime.morestack_noctxt.abi0(SB) 0x4941f0 ebae JMP main.main(SB) </syntaxhighlight> ターゲットは AMD64 ですが、見慣れないニーモニックだと思います。 これは Plan 9 のアセンブラフォーマットで、Intel 形式とも AT&T 形式とも異なります。レジスタは、8086 時代から存在するなら当時の名前(AX, BX, SP など)で、AMD64 で追加されたものは Rnn 形式(R14 など)で表示されます。 演算や転送の幅は、SUB'''Q''' や MOV'''L''' のように命令名の末尾の文字で指定されます(Q = 64ビット、L = 32ビットなど)。 Goはコンパイラーですが、コンパイラー自体がGoで書かれ、ソースコードとともに配布されており、他にも go tool nm や go tool pack の様なハウスキーピング用のコマンドがあります。 {{See|Go/goコマンド/tool/nm|Go/goコマンド/tool/pack}} {{Nav}} == 脚註 == <references /> == 参考文献 == * {{Cite web |url=https://golang.org/doc/asm |title=A Quick Guide to Go's Assembler |accessdate=2021/10/22 }} ppefizqyyhr9rncfvoc6rso8vaqaih3 アイヌ語 0 37830 305179 305029 2026-10-30T06:19:09Z BrassSnail 71325 /* 学習に役立つ本・ウェブサイト */ 305179 wikitext text/x-wiki {{Pathnav|語学|frame=1}} {{Wikipedia|アイヌ語}} {{Wiktionary|カテゴリ:アイヌ語}} '''アイヌ語'''({{lang|ain|Aynu itak}})は、北海道を中心に樺太、千島列島、本州北部などで話されてきた言語です。日本語と同じく、他の言語との系統関係の分かっていない「孤立した言語」に分類されます。日本語にとっては唯一の陸続きの言語で、古くから互いに言葉を借用し合うなどの大きな関わりがありました。日常の語彙、特に儀礼用語には、日本語とアイヌ語とで共通するものや似ているものが数多くあります。語法の面でも、「〜をやってみる」などの表現は日本語と全く同じような言い方で、隣り合って話されてきた近さが感じられます。 アイヌ語の基本的な語順は日本語と同じ主語-目的語-述語です。母音は五種類で、子音も日本語と同じものが多く、上述のように同じ発想の表現もあるため、日本語話者にとっては比較的習得しやすい言語といえます。 その一方、非常に強力な造語力を持ち、多くの要素を繋げて一つの長い単語で文のような役割を表すことなどもできます。 == ウィキブックスでの編集方針 == アイヌ語には表記法にバリエーションがある。ウィキブックスは教科書の類に入るので、学習時の分かり易さのためとして、最も多く使われている表記とは異なる表記を採ることがある。ただし、これまでに全く使われていない独自表記は避けた。 :表記変換器も用意されており、これを使えば自分の好きな表記で見ることができる。 :表記変換するには、[https://www.tampermonkey.net/ Tampermonkey]または類似の拡張機能を各自の[[w:ja:ウェブブラウザ|ブラウザ]]にインストールし、こちらのユーザースクリプトをインストールする。<br> :[https://greasyfork.org/ja/scripts/581917 ウィキメディア・プロジェクトのアイヌ語の表記変換] :ユーザースクリプトが使えないブラウザでは、こちらのサイトにあるブックマークレットを実行する。<br> :[https://toracatman.github.io/WikimediaBookmarklet/index.html ウィキメディア・プロジェクトのアイヌ語の表記変換ブックマークレット] また、長きに亙って公的な言語として使われてこなかったなどの理由から、アイヌ語には現代社会の事物・概念を表す言葉が不足しがちである。これを解決するために、様々な場で新語や新しい表現などを作り使おうとする取り組みが行われているが、本書ではこれらを教材の中に積極的に取り入れることはせず、使用する場合であっても、試行的な表現であることやこれまで実際に使われてきた表現とは違うことなどができるだけ判るようにする。 ==[[アイヌ語 入門編|入門編]]== *[[アイヌ語の世界へようこそ]] *[[アイヌ語 文字入力の準備|文字入力の準備]] *[[アイヌ語 文字と発音|文字と発音]] **[[アイヌ語 付録:キリル文字対照表|付録:キリル文字対照表]] *[[アイヌ語 アクセント|アクセント]] *[[アイヌ語 音の変化|音の変化]] *[[付録:アイヌ語 表記の揺れについて|付録:表記の揺れについて]] *[[付録:アイヌ語 方言について|付録:アイヌ語の方言について]] ==話す、聞く== === 会話練習 === #[[アイヌ語定型文練習 タンペ へマンタ アン?|これは何?]] #[[アイヌ語 自己紹介|自己紹介]] === 例文集(慣用句、よく使う文) === * [[アイヌ語 挨拶|挨拶]] * == [[アイヌ語 文法|文法]] == *「~は~だ」の形の文 *否定 *動詞の種類 *人称接辞 *位置名詞 ==[[アイヌ語 テーマ別重要語彙|テーマ別 重要語彙]]== *[[アイヌ語 数の数え方|数の数え方]] *[[アイヌ語 暦|暦]] *[[アイヌ語 人称接辞の一覧|地域毎の人称接辞一覧]] *[[アイヌ語 位置名詞の一覧|位置名詞一覧]] *[[アイヌ語 親族名称|親族名称]] *[[アイヌ語 代表的な動植物の一覧|動植物]] *[[アイヌ語 程度を表す表現|程度を表す表現]] == [[アイヌ語 学習に役立つ文献やウェブサイト|学習に役立つ本・ウェブサイト]]<!-- 辞書欄を除いては、情報が溢れないようにし、入門者にも使いやすく信頼の置けるものを重点的に載せてください。 -->== ''詳細は「[[アイヌ語 読書・資料案内]]」をご覧ください...'' 一部のサイトで使える表記変換器も用意した。<br> [https://toracatman.github.io/AinuNotationConverter/index.html アイヌ語の表記変換器] === 総合 === * [https://www.ff-ainu.or.jp/web/potal_site/index.html アイヌ民族文化財団 アイヌ語ポータルサイト] * [https://www.bunka.go.jp/seisaku/kokugo_nihongo/kokugo_shisaku/kikigengo/ainu/index.html 文化庁 アイヌ語に関するリンク集] === 音声を聞く === * [https://ainugo.nam.go.jp/search/media?typeCont=on&typeAudio=on&typeVideo=on 国立アイヌ民族博物館アイヌ語アーカイブ 資料検索] * [https://ainugo.aa-ken.jp/ AA研アイヌ語資料 公開プロジェクト] * [https://ainugo.hm.pref.hokkaido.lg.jp/generalSearchResult.aspx ほっかいどう アイヌ語アーカイブ|北海道博物館] * [https://www.youtube.com/@user-jr8bk2iy1n YouTube 公益財団法人アイヌ民族文化財団のチャンネル] * [https://www.ff-ainu.or.jp/web/learn/language/animation/index.html オルシペスウォプ 口承文芸視聴覚資料作成事業|アイヌ民族文化財団] * [https://www.stv.jp/radio/ainugo/index.html STVアイヌ語ラジオ講座] :: テキストなどは[https://www.ff-ainu.or.jp/web/potal_site/radio.html ここ]から見られる。 * [https://ainu.ninjal.ac.jp/folklore/ アイヌ語口承文芸コーパス ー音声・グロス付きー] * [https://ainu.ninjal.ac.jp/topic/ トピック別 アイヌ語会話辞典] * [http://itelmen.placo.net/Ainu-archives/index.html アイヌ語鵡川方言 日本語-アイヌ語辞典|千葉大学大学院 人文社会科学研究科] === 独習書・文法書など === * 『ニューエクスプレスプラス アイヌ語』({{ISBN|978-4-560-08868-5}})中川裕(2021) ::「会話から文法を一冊で学べる入門書に」という言葉の通り、初めてアイヌ語を学ぶ人にはおすすめの一冊。CDやアプリで音声を聞く事もできる。 * 『アイヌ語広文典』({{ISBN|978-4-560-09963-6}})中川裕(2025) ::アイヌ語学習のためのハンドブック。発音・表記から諸方言の違い、文法、表現、文芸、歴史までを解説する大著。本格的に学ぼうとするときにはたいへん役に立つ。 *『言語学大辞典』第一巻({{ISBN|978-4-385-15213-4}})亀井孝 他編 所収「アイヌ語」田村すゞ子(1997) :: 分冊版の『言語学大辞典セレクション 日本列島の言語』({{ISBN|4-385-15207-1}})にも同じ内容が書かれている。 === 辞書・単語集 === パソコンの場合、これらのページでControl (Ctrl) + Fキーを押すと、素早く検索できる。 ==== 書籍版 ==== *『アイヌ語千歳方言辞典』中川裕(1995) *『アイヌ語沙流方言辞典』田村すゞ子(1996) *『萱野茂のアイヌ語辞典』萱野茂(1996) ==== ウェブサイト ==== *[https://ainugo.nam.go.jp/ 国立アイヌ民族博物館アイヌ語アーカイブ] ::辞書以外の資料からも検索できる。辞書は、田村すず子『アイヌ語沙流方言辞典』(1996)、萱野茂著『萱野茂のアイヌ語辞典』(1996)、知里真志保『分類アイヌ語辞典 植物編・動物編』(1953)の3冊を基にしている。 *アイヌ語ポータルサイトより ** [https://www.ff-ainu.or.jp/teach/files/ishikari_tango.pdf 単語リスト(アイヌ語・日本語)-石狩川-] ** [https://www.ff-ainu.or.jp/teach/files/saru_tango.pdf 単語リスト(アイヌ語・日本語)-沙流-] ** [https://www.ff-ainu.or.jp/teach/files/karahuto_tango.pdf 単語リスト(アイヌ語・日本語)-カラフト]- * [https://kampisos.aynu.io/ kampisos.aynu.io — Kampisos - アイヌ語コーパス検索] *[https://itah.aynu.org/ja 樺太アイヌ語の単語リスト] *[https://web.archive.org/web/20240226075541/https://tommy1949.world.coocan.jp/aynudictionary.htm 富田隆 氏によるアイヌ語電子辞書] :: === 物語 === *『アイヌ神謡集』知里幸惠 {{ISBN|978-4-00-320801-4}}、[https://www.aozora.gr.jp/cards/001529/files/44909_29558.html 青空文庫] == その他 == === アイヌ語を使って創作、執筆などを行う取り組み=== [[incubator:Wp/ain/Main_Page|アイヌ語版ウィキペディア]] [https://otarunay.at-ninja.jp/taimuzu.html アイヌタイムズ] [https://wiki.aynu.org/wiki/Mosem Aynuwiki] [https://parunpe.mystrikingly.com/ パルンペ(parunpe)] === アイヌ語やアイヌ文化を題材、モチーフとした創作 === ==== 漫画 ==== *[https://www.shueisha.co.jp/books/search/search.html?seriesid=37334 ゴールデンカムイ] [[カテゴリ:語学]] [[カテゴリ:アイヌ語|*]] a8isuz9ruvk6ie14h3poo2zuhy4jcu7 Go/0.0 0 45715 305195 276633 2026-10-30T09:18:47Z Ef3 694 IEEE 754標準では +0.0 と -0.0 は区別されますが、Goの数値リテラル(型なし定数)は無限精度で処理される仕様上、定数としての -0.0 は符号情報が保持されず正のゼロとして扱われます。そのため、変数に代入しても math.Signbit(negativeZero) は false を返します。 305195 wikitext text/x-wiki Goにおける '''数値リテラル <code>[[../0.0|0.0]]</code>''' は、'''「[[../浮動小数点型|浮動小数点型]]の[[../Zero value|ゼロ値]]」''' として重要な役割を果たします。整数の <code>[[../0|0]]</code> とは異なる特性を持ち、浮動小数点数特有の振る舞いを示します。 == 数値リテラル <code>[[../0.0|0.0]]</code> の基本 == === 浮動小数点型としての <code>[[../0.0|0.0]]</code> === :<syntaxhighlight lang=go copy> var f float64 = 0.0 // float64型の0.0 var g float32 = 0.0 // float32型の0.0 var h = 0.0 // 型推論により float64 </syntaxhighlight> * Goでは、<code>[[../0.0|0.0]]</code> は '''型推論''' によって <code>[[../float64|float64]]</code> 型として扱われます * 小数点を含む数値リテラルは浮動小数点型として解釈されます === 整数リテラル <code>[[../0|0]]</code> との違い === :<syntaxhighlight lang=go copy> var i int = 0 // 整数型のゼロ値 var f float64 = 0.0 // 浮動小数点型のゼロ値 var mixed float64 = 0 // 整数リテラルも浮動小数点型の初期値に使用可能 </syntaxhighlight> == 「ゼロ値(Zero Value)」としての <code>[[../0.0|0.0]]</code> == Goでは、'''浮動小数点型の変数を宣言した時点で暗黙的に初期化される値''' が <code>[[../0.0|0.0]]</code> です。 === 浮動小数点型のゼロ値 === {| class="wikitab" ! 型 | ゼロ値 |- | <code>[[../float32|float32]]</code> || <code>[[../0.0|0.0]]</code> |- | <code>[[../float64|float64]]</code> || <code>[[../0.0|0.0]]</code> |- | <code>[[../complex64|complex64]]</code> || <code>(0+0i)</code> |- | <code>[[../complex128|complex128]]</code> || <code>(0+0i)</code> |- === 例: ゼロ値の自動初期化 === :<syntaxhighlight lang=go copy> var temperature float64 // temperature == 0.0 var price float32 // price == 0.0 var ratio float64 // ratio == 0.0 </syntaxhighlight> == 浮動小数点数特有の <code>[[../0.0|0.0]]</code> の振る舞い == ; 正のゼロと負のゼロ :<syntaxhighlight lang=go copy> var positiveZero float64 = 0.0 var negativeZero float64 = -0.0 fmt.Println(positiveZero == negativeZero) // true(等価性チェック) fmt.Println(math.Signbit(positiveZero)) // false fmt.Println(math.Signbit(negativeZero)) // false </syntaxhighlight> : IEEE 754標準に従い、<code>+0.0</code> と <code>-0.0</code> は異なる表現を持ちますが、等価性チェックでは同じとして扱われます : IEEE 754標準では <code>+0.0</code> と <code>-0.0</code> は区別されますが、Goの数値リテラル(型なし定数)は無限精度で処理される仕様上、定数としての <code>-0.0</code> は符号情報が保持されず正のゼロとして扱われます。そのため、変数に代入しても <code>math.Signbit(negativeZero)</code> は <code>false</code> を返します。 ; ゼロ除算の特別な処理 :<syntaxhighlight lang=go copy> var zero float64 = 0.0 fmt.Println(1.0 / zero) // +Inf(正の無限大) fmt.Println(-1.0 / zero) // -Inf(負の無限大) fmt.Println(0.0 / zero) // NaN(非数) </syntaxhighlight> : 浮動小数点数のゼロ除算は実行時エラーにならず、特殊値を返します ; 無限小の比較 :<syntaxhighlight lang=go copy> var epsilon float64 = 1e-10 var zero float64 = 0.0 fmt.Println(epsilon > zero) // true fmt.Println(epsilon == zero) // false </syntaxhighlight> == <code>[[../0.0|0.0]]</code> の実用的な用途 == ; 数値計算の初期値 :<syntaxhighlight lang=go copy> sum := 0.0 // 合計値の初期化 average := 0.0 // 平均値の初期化 </syntaxhighlight> ; 閾値との比較 :<syntaxhighlight lang=go copy> threshold := 1e-9 if math.Abs(result - expected) < threshold { // 浮動小数点数の近似的な等価性チェック } </syntaxhighlight> ; 配列・スライスの初期化 :<syntaxhighlight lang=go copy> data := make([]float64, 10) // 全要素が0.0で初期化 </syntaxhighlight> == 注意点とベストプラクティス == === 浮動小数点の精度問題 === :<syntaxhighlight lang=go copy> var a float64 = 0.1 + 0.2 var b float64 = 0.3 fmt.Println(a == b) // false(浮動小数点誤差) fmt.Println(a) // 0.30000000000000004 </syntaxhighlight> : <code>[[../0.0|0.0]]</code> との比較時も浮動小数点誤差に注意が必要です === NaN と無限大の検出 === :<syntaxhighlight lang=go copy> if math.IsNaN(value) { // NaN の処理 } if math.IsInf(value, 0) { // 無限大の処理 } </syntaxhighlight> === 型変換時の注意 === :<syntaxhighlight lang=go copy> var i int = 0 var f float64 = float64(i) // 明示的な型変換 // var f float64 = i // エラー:暗黙的な型変換は不可 </syntaxhighlight> == 他の言語との比較 == === C言語 === * <code>[[../0.0|0.0]]</code> は <code>[[../double|double]]</code> 型として扱われる * 暗黙的な型変換が多く、整数の <code>[[../0|0]]</code> と混在しやすい === Python === * <code>[[../0.0|0.0]]</code> は <code>[[../float|float]]</code> 型 * 動的型付けのため、整数の <code>[[../0|0]]</code> との相互変換が柔軟 === Go === * <code>[[../0.0|0.0]]</code> は厳密に浮動小数点型 * 型安全性が高く、意図しない型変換を防げる == まとめ == * Goの <code>[[../0.0|0.0]]</code> は '''「浮動小数点型のゼロ値」''' であり、IEEE 754標準に準拠した振る舞いを示します * 整数の <code>[[../0|0]]</code> とは明確に区別され、型システムの安全性に貢献しています * 浮動小数点数特有の正のゼロ・負のゼロ、ゼロ除算時の特殊値処理など、数値計算における重要な概念を理解する上で重要です * 精度問題や型変換に注意しながら使用することで、安全で正確な数値計算を実現できます 「<code>[[../0.0|0.0]]</code> は単なる浮動小数点のゼロではなく、Goの '''『型安全性』と『数値計算の正確性』を両立させる重要な要素'''」として位置付けられます! {{DEFAULTSORT:0.0}} [[Category:Go]] kshux2vhc327eq77bkrn77tuvun3869 305196 305195 2026-10-30T09:19:57Z Ef3 694 /* 浮動小数点数特有の 0.0 の振る舞い */ -: IEEE 754標準に従い、<code>+0.0</code> と <code>-0.0</code> は異なる表現を持ちますが、等価性チェックでは同じとして扱われます 305196 wikitext text/x-wiki Goにおける '''数値リテラル <code>[[../0.0|0.0]]</code>''' は、'''「[[../浮動小数点型|浮動小数点型]]の[[../Zero value|ゼロ値]]」''' として重要な役割を果たします。整数の <code>[[../0|0]]</code> とは異なる特性を持ち、浮動小数点数特有の振る舞いを示します。 == 数値リテラル <code>[[../0.0|0.0]]</code> の基本 == === 浮動小数点型としての <code>[[../0.0|0.0]]</code> === :<syntaxhighlight lang=go copy> var f float64 = 0.0 // float64型の0.0 var g float32 = 0.0 // float32型の0.0 var h = 0.0 // 型推論により float64 </syntaxhighlight> * Goでは、<code>[[../0.0|0.0]]</code> は '''型推論''' によって <code>[[../float64|float64]]</code> 型として扱われます * 小数点を含む数値リテラルは浮動小数点型として解釈されます === 整数リテラル <code>[[../0|0]]</code> との違い === :<syntaxhighlight lang=go copy> var i int = 0 // 整数型のゼロ値 var f float64 = 0.0 // 浮動小数点型のゼロ値 var mixed float64 = 0 // 整数リテラルも浮動小数点型の初期値に使用可能 </syntaxhighlight> == 「ゼロ値(Zero Value)」としての <code>[[../0.0|0.0]]</code> == Goでは、'''浮動小数点型の変数を宣言した時点で暗黙的に初期化される値''' が <code>[[../0.0|0.0]]</code> です。 === 浮動小数点型のゼロ値 === {| class="wikitab" ! 型 | ゼロ値 |- | <code>[[../float32|float32]]</code> || <code>[[../0.0|0.0]]</code> |- | <code>[[../float64|float64]]</code> || <code>[[../0.0|0.0]]</code> |- | <code>[[../complex64|complex64]]</code> || <code>(0+0i)</code> |- | <code>[[../complex128|complex128]]</code> || <code>(0+0i)</code> |- === 例: ゼロ値の自動初期化 === :<syntaxhighlight lang=go copy> var temperature float64 // temperature == 0.0 var price float32 // price == 0.0 var ratio float64 // ratio == 0.0 </syntaxhighlight> == 浮動小数点数特有の <code>[[../0.0|0.0]]</code> の振る舞い == ; 正のゼロと負のゼロ :<syntaxhighlight lang=go copy> var positiveZero float64 = 0.0 var negativeZero float64 = -0.0 fmt.Println(math.Signbit(positiveZero)) // false fmt.Println(math.Signbit(negativeZero)) // false </syntaxhighlight> : IEEE 754標準では <code>+0.0</code> と <code>-0.0</code> は区別されますが、Goの数値リテラル(型なし定数)は無限精度で処理される仕様上、定数としての <code>-0.0</code> は符号情報が保持されず正のゼロとして扱われます。そのため、変数に代入しても <code>math.Signbit(negativeZero)</code> は <code>false</code> を返します。 ; ゼロ除算の特別な処理 :<syntaxhighlight lang=go copy> var zero float64 = 0.0 fmt.Println(1.0 / zero) // +Inf(正の無限大) fmt.Println(-1.0 / zero) // -Inf(負の無限大) fmt.Println(0.0 / zero) // NaN(非数) </syntaxhighlight> : 浮動小数点数のゼロ除算は実行時エラーにならず、特殊値を返します ; 無限小の比較 :<syntaxhighlight lang=go copy> var epsilon float64 = 1e-10 var zero float64 = 0.0 fmt.Println(epsilon > zero) // true fmt.Println(epsilon == zero) // false </syntaxhighlight> == <code>[[../0.0|0.0]]</code> の実用的な用途 == ; 数値計算の初期値 :<syntaxhighlight lang=go copy> sum := 0.0 // 合計値の初期化 average := 0.0 // 平均値の初期化 </syntaxhighlight> ; 閾値との比較 :<syntaxhighlight lang=go copy> threshold := 1e-9 if math.Abs(result - expected) < threshold { // 浮動小数点数の近似的な等価性チェック } </syntaxhighlight> ; 配列・スライスの初期化 :<syntaxhighlight lang=go copy> data := make([]float64, 10) // 全要素が0.0で初期化 </syntaxhighlight> == 注意点とベストプラクティス == === 浮動小数点の精度問題 === :<syntaxhighlight lang=go copy> var a float64 = 0.1 + 0.2 var b float64 = 0.3 fmt.Println(a == b) // false(浮動小数点誤差) fmt.Println(a) // 0.30000000000000004 </syntaxhighlight> : <code>[[../0.0|0.0]]</code> との比較時も浮動小数点誤差に注意が必要です === NaN と無限大の検出 === :<syntaxhighlight lang=go copy> if math.IsNaN(value) { // NaN の処理 } if math.IsInf(value, 0) { // 無限大の処理 } </syntaxhighlight> === 型変換時の注意 === :<syntaxhighlight lang=go copy> var i int = 0 var f float64 = float64(i) // 明示的な型変換 // var f float64 = i // エラー:暗黙的な型変換は不可 </syntaxhighlight> == 他の言語との比較 == === C言語 === * <code>[[../0.0|0.0]]</code> は <code>[[../double|double]]</code> 型として扱われる * 暗黙的な型変換が多く、整数の <code>[[../0|0]]</code> と混在しやすい === Python === * <code>[[../0.0|0.0]]</code> は <code>[[../float|float]]</code> 型 * 動的型付けのため、整数の <code>[[../0|0]]</code> との相互変換が柔軟 === Go === * <code>[[../0.0|0.0]]</code> は厳密に浮動小数点型 * 型安全性が高く、意図しない型変換を防げる == まとめ == * Goの <code>[[../0.0|0.0]]</code> は '''「浮動小数点型のゼロ値」''' であり、IEEE 754標準に準拠した振る舞いを示します * 整数の <code>[[../0|0]]</code> とは明確に区別され、型システムの安全性に貢献しています * 浮動小数点数特有の正のゼロ・負のゼロ、ゼロ除算時の特殊値処理など、数値計算における重要な概念を理解する上で重要です * 精度問題や型変換に注意しながら使用することで、安全で正確な数値計算を実現できます 「<code>[[../0.0|0.0]]</code> は単なる浮動小数点のゼロではなく、Goの '''『型安全性』と『数値計算の正確性』を両立させる重要な要素'''」として位置付けられます! {{DEFAULTSORT:0.0}} [[Category:Go]] but9kazvx6mxtgysrvtvk67dbql70wd 論語/巻第二 八佾第三/第十二 0 48702 305191 302389 2026-10-30T08:11:52Z Tomzo 248 305191 wikitext text/x-wiki ==本文== :  <div style="text-align: center;"> <div style="display: inline-block; text-align: left;"> <small> {{#invoke:Kanbun|kanbun| 祭ルコト如クシ[レ]在いまスガ、祭ルコト[レ]神ヲ如クス[二]神在いまスガ[一]。\\ 子曰ク「吾不レバ[レ]與あづかラ[レ]祭ニ、如シ[レ]不ルガ[レ]祭ラ。」 }} </small> </div> </div> == 訓読文と語釈等 == <div> {| class="wikitable" style="width:100%;" |+ ! style="width:50%;" | 訓読文 ! style="width:50%;" | 語釈等 |- |style="vertical-align:top"|<big> 祭る<ref group="†">「祭」は1文字では、祖先の霊を祭ること。「肉」+「又(=手)」+「示(=祭壇)」の会意文字で、祭壇に犠牲の肉を供える儀式。</ref>こと{{ruby|在|いま}}すが如くし、神<ref group="†">「神」は、天候などを司る超越的存在、一方で、土地を司る超越的存在を「祇」といい、合わせて「天神地祇」と言う。</ref>を祭ること神{{ruby|在|いま}}すが如くす。 子曰く「吾祭に{{ruby|與|あづか}}らざれば、祭らざるが如し。」 </big> |style="vertical-align:top"|<small><references group="†"/></small> |} </div> == 現代語和訳 == [[w:下村湖人|下村湖人]][https://www.aozora.gr.jp/cards/001097/files/43785_58836.html 『現代訳論語』(青空文庫)より] :先師は、祖先を祭る時には、祖先をまのあたりに見るような、また、神を祭る時には、神をまのあたりに見るようなご様子で祭られた。 :そしていつもいわれた。―― ::「私は自分みずから祭を行わないと、祭ったという気がしない。」 == 解説 == 「八佾」は儀礼・典礼に関する逸話を多く集めた篇である。古代中国の儀礼の中心は祖先祭祀であり、この儀礼の「しきたり」を整理したものが「礼」であり、諸子百家における孔子の儒家を他の思想と大きく区別する要素の一つである。しかし、後述するように、孔子は、儀礼が形式主義に堕さないよう戒めている。 本話は、祭祀を行う場合の心構えについて説く。 前半は、祖先を祭るなら祖先がそこに実際にいるかのように、神を祭るなら神がそこに実際にいるかのように祭る、すなわち、単に儀礼の手順を機械的にこなすのではなく、「今、自分は本当に祖先・神と向き合っている」という精神状態で祭祀を行えと説いている。これは儒教の祭祀観をよく表しており、孔子は、神霊の存在について形而上学的な議論をするよりも、祭祀を行う人間の態度を問題にしている。論語には「八佾」をはじめとして、祭祀・儀礼は形式ではなく催す者の真心が大切であると多く説いている。 後半は、「自分が参与できないのであれば、その祭祀は(自分にとって)なかったも同然である」と言っている。ここで、「与(與)る」と言っているのは、単に、その場に臨席するのではなく祭祀に心から参与するという意味合いを持つ。したがって、自分自身が祭祀に参与して、心をそこに置かなければ、それは祭祀をしたことにならない、という意味になっている。前半部では「如在」するのは祖先や神であるが、後半部で祭祀を行う者も「如在」しなければ祭ったことにならないと説いている。 また、後半部は、当時の祭祀において、本人が何らかの事情で直接参加できず、代理の者に祭らせることもあり、「型どおりの儀礼をやっておけば、それで祭祀が成立する」とする風潮に対する批判であるともされている。これは、祭祀の儀礼のみならず、「礼」一般について、礼の外形だけを守ればよいとは考えておらず、同じ「八佾」の「人而不仁、如禮何」(八佾第三)の考え方につながる。 ただし、孔子は儀礼の形式面を軽視しているのではなく、あくまでも「如」として行うことも説いており、形式たる外面とそれを行う内心との調和を求めるものである。 == 関連事項 == 「如才ない」などに用いられる「[[Wikt:如才|如才]]」、「[[wikt:如在|如在]]」の[[wikt:語源|語源]]である。 {{DEFAULTSORT:はちいつ12}} [[Category:論語]] ew1ijv04i80uu1h6ww0986r2ddzxjeo アイヌ語 読書・資料案内 0 48743 305180 305033 2026-10-30T06:58:28Z BrassSnail 71325 305180 wikitext text/x-wiki [[アイヌ語]] > '''学習に役立つ文献やウェブサイト''' ここでは、トップページに載せられなかったものも含めて、アイヌ語の学習に役立つ様々な本、雑誌、ウェブサイトなどを紹介する。また、現在は外部サイトの[https://note.com/wombat13/n/nc98844bc2248 アイヌ語をがっつり学びたくなった時のための記事 – Wombat (note.com)]などもこの記事に類するものとして参考になる。 == アイヌ語に触れたい == アイヌ語かるた == 学ぶ == 中川裕『アイヌ語広文典』{{ISBN|978-4-560-09963-6}} == 単語や実際の用例を調べる == === 単語集、用例のない辞書 === アイヌ語ポータルサイトより、単語リスト(アイヌ語・日本語)それぞれ1000語程度 * [https://www.ff-ainu.or.jp/teach/files/ishikari_tango.pdf -石狩川-] * [https://www.ff-ainu.or.jp/teach/files/saru_tango.pdf -沙流-] * [https://www.ff-ainu.or.jp/teach/files/karahuto_tango.pdf -カラフト-] [https://itah.aynu.org/ja 樺太アイヌ語の辞書]全2495語(2026年10月時点) [https://web.archive.org/web/20240226075541/https://tommy1949.world.coocan.jp/aynudictionary.htm 富田隆 氏によるアイヌ語電子辞書]1万5005項目、語数約1万8000語 === 用例付き辞書、コーパスからの検索 === 萱野茂『萱野茂のアイヌ語辞典 新装版』三省堂、2026年(原著は1996年,2002年増補) : 見出し語数1800語、図版320点 ISBN 978-4-385-17053-4 [https://ainugo.nam.go.jp/ 国立アイヌ民族博物館アイヌ語アーカイブ] : 辞書以外の資料からも検索できる。辞書は、田村すず子『アイヌ語沙流方言辞典』(1996)、萱野茂著『萱野茂のアイヌ語辞典』(1996)、知里真志保『分類アイヌ語辞典 植物編・動物編』(1953)の3冊を基にしている。 === 特定分野に特化したもの === == アイヌ文化 == == アイヌ、アイヌ語、アイヌ文化等に関する様々なものを扱っている博物館 == https://ainu-upopoy.go.jp/museum/ == ポータルサイト == 公益財団法人 アイヌ民族文化財団「[https://www.ff-ainu.or.jp/web/potal_site/index.html アイヌ語ポータルサイト]」 {{substub|20260825}} [[category:アイヌ語]] 26wm0adrwakmsx4pwywer0c4j4fpumc 305186 305180 2026-10-30T07:36:06Z BrassSnail 71325 /* 用例付き辞書、コーパスからの検索 */ 305186 wikitext text/x-wiki [[アイヌ語]] > '''学習に役立つ文献やウェブサイト''' ここでは、トップページに載せられなかったものも含めて、アイヌ語の学習に役立つ様々な本、雑誌、ウェブサイトなどを紹介する。また、現在は外部サイトの[https://note.com/wombat13/n/nc98844bc2248 アイヌ語をがっつり学びたくなった時のための記事 – Wombat (note.com)]などもこの記事に類するものとして参考になる。 == アイヌ語に触れたい == アイヌ語かるた == 学ぶ == ニューエクスプレスプラス アイヌ語 エクスプレス アイヌ語 中川裕『アイヌ語広文典』<small>{{ISBN|978-4-560-09963-6}}</small> アイヌ語ポータルサイト == 音声を聞く == == 単語や実際の用例を調べる == === 単語集、用例のない辞書 === アイヌ語ポータルサイトより、単語リスト(アイヌ語・日本語)それぞれ1000語程度 * [https://www.ff-ainu.or.jp/teach/files/ishikari_tango.pdf -石狩川-] * [https://www.ff-ainu.or.jp/teach/files/saru_tango.pdf -沙流-] * [https://www.ff-ainu.or.jp/teach/files/karahuto_tango.pdf -カラフト-] [https://itah.aynu.org/ja 樺太アイヌ語の辞書]全2495語(2026年10月時点) [https://web.archive.org/web/20240226075541/https://tommy1949.world.coocan.jp/aynudictionary.htm 富田隆 氏によるアイヌ語電子辞書]1万5005項目、語数約1万8000語 [https://itak.aynu.org/ 現代アイヌ語翻訳用語集]1827項目(2026年10月時点) === 用例付き辞書、コーパスからの検索 === 中川裕『アイヌ語千歳方言辞典』草風館(1995)<small>ISBN 978-4-88323-078-5</small> 田村すゞ子『アイヌ語沙流方言辞典』草風館(1996)<small>ISBN 978-4-88323-093-8</small> 萱野茂『萱野茂のアイヌ語辞典 新装版』三省堂(2026/1996)<small>ISBN 978-4-385-17053-4</small> 図版320点付き [https://ainugo.nam.go.jp/ 国立アイヌ民族博物館アイヌ語アーカイブ] : 辞書以外の資料からも検索できる。辞書は、田村すず子『アイヌ語沙流方言辞典』(1996)、萱野茂著『萱野茂のアイヌ語辞典』(1996)、知里真志保『分類アイヌ語辞典 植物編・動物編』(1953)の3冊を基にしている。 [https://kampisos.aynu.io/ Kampisos – aynu.io] [https://corpus.aynu.org/ corpus.aynu.org – Aynu.org] [https://ainu.ninjal.ac.jp/folklore/corpus/jp/ アイヌ語口承文芸コーパス ー音声・グロス付き-] === 特定分野に特化したもの === 知里真志保『分類アイヌ語辞典』[https://www.i-repository.net/il/cont/01/G0000723jmpapers/000/686/000686661.pdf 「第1巻植物編(1953)」][https://www.i-repository.net/il/cont/01/G0000723jmpapers/000/686/000686613.pdf 「第2巻動物編(1962,遺稿)」][https://www.i-repository.net/il/cont/01/G0000723jmpapers/000/686/000686621.pdf 「第3巻人間編(1954)」] == アイヌ文化 == == アイヌ、アイヌ語、アイヌ文化等に関する様々なものを扱っている博物館 == https://ainu-upopoy.go.jp/museum/ == ポータルサイト == 公益財団法人 アイヌ民族文化財団「[https://www.ff-ainu.or.jp/web/potal_site/index.html アイヌ語ポータルサイト]」 {{substub|20260825}} [[category:アイヌ語]] 2tnx8h9zahb3q08up2ghqw4xax2k7uy 論語/巻第六 先進第十一/第一 0 48939 305167 304858 2026-10-29T13:30:17Z Tomzo 248 /* 解説 */ 305167 wikitext text/x-wiki ==本文== <div style="text-align: center;"> <div style="display: inline-block; text-align: left;"> <small> {{#invoke:Kanbun|kanbun| 子曰{いはク}、\\  先進於[二]{おケルハ}禮樂[一]{ニ}、 野人也{なり}、 \\  後進於[二]{おケルハ}禮樂[一]{ニ}、 君子也{なり}。 \\  如{もシ}用[レ]{もちヒバ}之{ヲ}、 則{すなはチ}吾從[二]{したがハン}先進[一]{ニ}。 }} </small> </div> </div> == 訓読文と語釈等 == <div> {| class="wikitable" style="width:100%;" |+ ! style="width:35%;" | 訓読文 ! style="width:65%;" | 語釈等 |- |style="vertical-align:top"|<big> {{ruby|子|し}}{{ruby|曰|いは}}く、 :先進<ref group="†" name="先進">「[[#礼楽|礼楽]]」の新旧。「先進」はある分野で先んじていることであり、先んじた礼楽、即ち、周建国時の礼楽と、孔子が生きている時代の礼楽を「後進」として比較したもの。又は、殷以前と周以後との説もある。なお、「先進・後進」は本来「先輩・後輩」の同義語であり、「先進篇」は、多く講師の弟子に関する逸話を含む篇であるため、「先進・後進」は孔子の弟子の分類を示すとの解釈([[w:木村英一|木村英一]]など、[[#解説2|解説参照]])もある。<br/></ref>の禮樂<ref group="†" name="礼楽">{{anchors|礼楽}}礼楽 - 礼(立ち居振る舞い)と音楽(日本で雅楽として知られるもののルーツ)</ref>に於けるは野人なり。 :後進<ref group="†" name="先進"/>の禮樂<ref group="†" name="礼楽"/>に於けるは君子なり<ref group="†">朱熹の註(新註)では、孔子による評ではなく、世間における浅はかな印象としている。</ref>。 :<u>{{ruby|如|も}}し<ref group="†">もし…であったら。文頭・文中に置いて仮定条件を表す(=若)。</ref></u>之を<u>用ひ<ref group="†">「礼楽」の様式に従う。又は、部下として用いる([[#解説2|解説参照]])。</ref></u>ば、則ち吾は先進に從はん。 :::::</big><small>([[s:論語 (漢文叢書)/先進第十一|ウィキソースより]])</small> |style="vertical-align:top"|<small><references group="†"/></small> |} </div> == 現代語和訳 == [[w:下村湖人|下村湖人]][https://www.aozora.gr.jp/cards/001097/files/43785_58836.html 『現代訳論語』(青空文庫)より] :先師がいわれた。―― ::礼楽の道において、昔の人は土くさい野人、今の人は磨きのかかった上流人、と、そう世間で考えるのも一応尤もだ。 ::しかし、もし私がそのいずれか一つを選ぶとすると、私は昔の人の歩んだ道を選びたい。 :(形式美のみあつて内容の空虚なのを排したのである。) == 解説 == 礼楽 ー宮殿などでの立ち居振る舞いの作法と音楽ー は、昔のものはぎこちなく野暮ったい一方で、最近のものは洗練されているとの評があるが、自分は、野暮ったくても、昔の礼楽を用いるのだという、孔子の宣言である。孔子は、いくら外見が洗練されていようとも、その振る舞いをする人、音楽を奏でる人に[[論語/巻第二 里仁第四/第十五|心底からの真心(忠恕)]]がなければ意味がないと言っている。孔子は、物事の内なる本質('''質''')とそれを外にアピールすること('''文''')はともに大切であると説くが、質に文が足りていない状態を「野」と言った([[論語/巻第三 雍也第六/第十六|巻第三 雍也第六/第十六]])。逆にいうと「野」であることは、本質は足りているということを言う。 {{anchors|解説2}}さて、ここまでは伝統的解釈であるが、「先進・後進」は本来「先輩・後輩」の意味であり、本篇『先進篇』は弟子たちの人物と志を論じ、個性に応じた教育と仁の実践を記述するという性質のものであれば、この「先進・後進」は孔子の弟子たちを、その入門時期で分けたものであると解釈する立場がある。「先進」の代表としては、子路、閔子騫、顔回、子貢が挙げられ、「後進」の代表には、子張、子夏、子游、曾子らが挙げられる。概ね、入門時期を「[[論語/巻第六 先進第十一/第二|陳蔡の間(次章参照)]]」前後で分け、その前から弟子のものを「先進」、その後に弟子になったものを「後進」とするものである。先進篇は、弟子の中でも先進にあたる弟子に関する逸話を多く含む。先進は、孔子が一家を成す前からの弟子であって出自や能力も様々、また、孔子自身も学問を高めつつあった頃の弟子であるので、先進の教え学ぶ礼楽はまだ粗野なものを残していた(例として、[[論語/巻第六 先進第十一/第十五|本篇第十五]]など)。一方、後進は孔子が有名になり多くの弟子をもって、その中から選抜された者であるので洗練された礼楽を身につけていた([[論語/巻第五 子罕第九/第二十三|巻第五 子罕第九/第二十三]]参照)。しかし、上記のように、孔子は、心根に見合わず外面を飾ることを嫌うので([[論語/巻第一 学而第一/第三|巻第一 学而第一/第三]]等参照)、先進を立てることで、後進を戒めたものである。 == 関連 == == 脚注 == <small><references /></small> [[Category:高等学校教育_国語_漢文|せんしん]] [[category:論語|せんしん01]] 9xg1drn1e61ncj1reyeaoknz6en0gqk コンピュータセキュリティ 0 48948 305181 305105 2026-10-30T07:09:23Z ~2026-54076-02 92740 305181 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらその構造を把握して破壊する高度なマルウェアは防げません。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。 次にメモリをダンプして保存してください。 * /dev/memを読み取る方法 * lime.koを使う方法 最後にダンプしたメモリから鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R: https://github.com/soimy/c3rb3r-rescue == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] n8kyxi6w9abi3lsuanolm2q2npxuyr1 305182 305181 2026-10-30T07:29:15Z ~2026-54076-02 92740 305182 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/memを読み取る方法 * lime.koを使う方法 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R: https://github.com/soimy/c3rb3r-rescue なおこの方法は共通鍵にのみ効果があります。非対称鍵を使ったランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] o3by004gdzqbxraq6te8ycwgv1cpqcf 305183 305182 2026-10-30T07:31:04Z ~2026-54076-02 92740 /* ランサムウェア被害からの復旧 */ 305183 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/memを読み取る方法 * lime.koを使う方法 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R: https://github.com/soimy/c3rb3r-rescue なおこの方法は共通鍵にのみ効果があります。非対称鍵をファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 2vomlixz109n3syfc9v043lm1o8v4lu 305184 305183 2026-10-30T07:32:03Z ~2026-54076-02 92740 /* ランサムウェア被害からの復旧 */ 305184 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/memを読み取る方法 * lime.koを使う方法 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うマルウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] gk8y3gyox21omu6ilz4n2bcfr398ytf 305185 305184 2026-10-30T07:34:44Z ~2026-54076-02 92740 /* ランサムウェア被害からの復旧 */ 305185 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/memを読み取る方法 * lime.koを使う方法 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] icsxcy70f2mgyd397hbbiq7q7xqt7yu 305187 305185 2026-10-30T07:37:27Z ~2026-54076-02 92740 /* ランサムウェア被害からの復旧 */ 305187 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/memを読み取る方法 * lime.koを使う方法 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 5pnx2t93rf0lko0iubpryledt923dft 305189 305187 2026-10-30T08:10:20Z ~2026-54076-02 92740 /* 被害からの復旧 */ 305189 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/memを読み取る方法 ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml] * lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う方法{{efn|Debian/Ubuntuではlime-forensics-dkmsパッケージ。}} 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] kef83rkh2npnfszpfcjnlbiov9z5rlu 305192 305189 2026-10-30T08:37:26Z ~2026-54076-02 92740 /* ランサムウェア被害からの復旧 */ 305192 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からのカーネル全域/ユーザーランドのメモリダンプにはカーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要がある。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ) 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 54zb271wwovlbxilqmubkyv1nw871tv 305193 305192 2026-10-30T08:54:57Z ~2026-54076-02 92740 305193 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からの Linux カーネル全域/ユーザーランドのメモリダンプには Linux カーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要がある。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ{{efn|Linuxカーネルのロックダウンが有効の場合 (<code>cat /sys/kernel/security/lockdown</code> が integrity または confidentiality の場合) は Machine-Owner Key (MOK) による署名が必要になる。}}) <!--TODO: 未検証 * eBPF プログラムによるメモリダンプ ** emd[https://github.com/ph0llux/emd] --> 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] km7td7dqxygdfagkv6b3hfmagrqx68a 305194 305193 2026-10-30T09:00:01Z ~2026-54076-02 92740 /* 被害からの復旧 */ 305194 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からの Linux カーネル全域/ユーザーランドのメモリダンプには Linux カーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要があります。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ{{efn|DKMS経由のカーネルモジュール導入は、UEFI セキュアブートなどで Linux カーネルのロックダウンが有効の場合 (<code>cat /sys/kernel/security/lockdown</code> が integrity または confidentiality の場合)、Machine-Owner Key (MOK) による署名が必要となります。}}) <!--TODO: 未検証 * eBPF プログラムによるメモリダンプ ** emd[https://github.com/ph0llux/emd] --> 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] nknhaa1fvtvjxvojwfl36c6l4357y6l 305197 305194 2026-10-30T09:40:49Z ~2026-54076-02 92740 305197 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からの Linux カーネル全域/ユーザーランドのメモリダンプには Linux カーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要があります。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ{{efn|DKMS経由のカーネルモジュール導入は、UEFI セキュアブートなどで Linux カーネルのロックダウンが有効の場合 (<code>cat /sys/kernel/security/lockdown</code> が integrity または confidentiality の場合)、Machine-Owner Key (MOK) の有効化が必要となります。MOK が無効になっている場合は再起動後に MokManager から MOK を有効にする必要があります。ただし MOK を有効にした場合はカーネルロックダウンが無意味になる(root権限があれば悪意のあるカーネルモジュールに署名して読み込ませられるようになる<ref>[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)ため注意が必要です。}}) <!--TODO: 未検証 * eBPF プログラムによるメモリダンプ ** emd[https://github.com/ph0llux/emd] --> 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 8om9gvdp3oxv59q9j43lij42buvtvdj 305198 305197 2026-10-30T09:46:28Z ~2026-54076-02 92740 305198 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からの Linux カーネル全域/ユーザーランドのメモリダンプには Linux カーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要があります。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ{{efn|DKMS経由のカーネルモジュール導入は、UEFI セキュアブートなどで Linux カーネルのロックダウンが有効の場合 (<code>cat /sys/kernel/security/lockdown</code> が integrity または confidentiality の場合)、Machine-Owner Key (MOK) の有効化が必要となります。MOK の鍵が無効になっている場合は再起動後に MokManager から MOK の鍵を有効にする必要があるため、MOK の鍵が無効かつ再起動が不可能な場合は lime-forensics-dkms を使うことはできません。また MOK を有効にした場合はカーネルロックダウンが無意味になる(root権限があれば悪意のあるカーネルモジュールに署名して読み込ませられるようになる<ref>[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}}) <!--TODO: 未検証 * eBPF プログラムによるメモリダンプ ** emd[https://github.com/ph0llux/emd] - 未検証 --> 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] 8otyqys1ud045re7yezq1picffn27m1 305199 305198 2026-10-30T09:48:43Z ~2026-54076-02 92740 305199 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からの Linux カーネル全域/ユーザーランドのメモリダンプには Linux カーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要があります。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ{{efn|DKMS経由のカーネルモジュール導入は、UEFI セキュアブートなどで Linux カーネルのロックダウンが有効の場合 (<code>cat /sys/kernel/security/lockdown</code> が integrity または confidentiality の場合)、Machine-Owner Key (MOK) の有効化が必要となります。MOK の鍵が無効になっている場合は再起動後に MokManager から MOK の鍵を有効にする必要があるため、MOK の鍵が無効かつ再起動が不可能な場合は lime-forensics-dkms を使うことはできません。また MOK を有効にした場合はカーネルロックダウンが無意味になる(root権限があれば悪意のあるカーネルモジュールに署名して読み込ませられるようになるため、root権限とカーネルモードのセキュリティ境界が無くなる<ref>[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}}) <!--TODO: 未検証 * eBPF プログラムによるメモリダンプ ** emd[https://github.com/ph0llux/emd] - 未検証 --> 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] ebv5argtxq78mvqdqa2d5zxdd44o7on 305200 305199 2026-10-30T10:38:16Z ~2026-54076-02 92740 /* TCP/UDP経由のサービス */ 305200 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 また外側に開いてるポートはランダム割り当てされないように sysctl の <code>net.ipv4.ip_local_reserved_ports</code> で予約しておきましょう <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からの Linux カーネル全域/ユーザーランドのメモリダンプには Linux カーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要があります。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ{{efn|DKMS経由のカーネルモジュール導入は、UEFI セキュアブートなどで Linux カーネルのロックダウンが有効の場合 (<code>cat /sys/kernel/security/lockdown</code> が integrity または confidentiality の場合)、Machine-Owner Key (MOK) の有効化が必要となります。MOK の鍵が無効になっている場合は再起動後に MokManager から MOK の鍵を有効にする必要があるため、MOK の鍵が無効かつ再起動が不可能な場合は lime-forensics-dkms を使うことはできません。また MOK を有効にした場合はカーネルロックダウンが無意味になる(root権限があれば悪意のあるカーネルモジュールに署名して読み込ませられるようになるため、root権限とカーネルモードのセキュリティ境界が無くなる<ref>[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}}) <!--TODO: 未検証 * eBPF プログラムによるメモリダンプ ** emd[https://github.com/ph0llux/emd] - 未検証 --> 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] ewj6w8lh8n8k735jg0ri96hns3vxh16 305201 305200 2026-10-30T10:49:13Z ~2026-54076-02 92740 /* TCP/UDP経由のサービス */ 305201 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> ハッシュの先頭5文字も渡したくない場合や、自社サービスでチェックを行いたい場合は上記のサービスが公式で提供するツール「haveibeenpwned-downloader」[https://github.com/HaveIBeenPwned/PwnedPasswordsDownloader]で全てのハッシュデータをダウンロードして自前で照合しましょう。 === 解析耐性のある鍵導出関数を使う === パスワードでは計算負荷の低い SHA-256 や SHA-512 などの通常のハッシュ関数、メモリ負荷の低い [[:w:PBKDF2|PBKDF2]] や bcrypt などの古い[[:w:鍵導出関数|鍵導出関数]](パスワードハッシュ関数)を使わないようにしましょう。これらの弱いハッシュ関数は 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> 弱いハッシュ関数を使用している場合は<code>passwd $USER</code>でパスワードを再設定して使用するハッシュ関数を更新してください。 一方、Windows 10 以前のローカルアカウントではパスワードハッシュがレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>(ユーザーID)\<wbr>V</code>{{efn|name="sam"}}のバイナリの以下の場所に存在します: * [[:w:LMハッシュ|LMハッシュ]]: 0xCC + (0x9C に指定されたオフセット)<ref name="sam-ghost"/> * NTLMハッシュ: 0xCC + (0xA8 に指定されたオフセット)<ref name="sam-ghost"/> LMハッシュは [[:w:LAN Manager|LAN Manager]] に使われていた [[:w:Data Encryption Standard|DES]] ベースの古いハッシュ、NTLMハッシュは [[:w:NT LAN Manager|NT LAN Manager]] に使われている [[:w:MD4|MD4]] ベースの古いハッシュであり、どちらも非常に弱いものとなっていました。 また Windows の Active Directory ドメインアカウントのオフライン認証向けキャッシュ済みドメイン資格情報はレジストリの<code>HKEY_LOCAL_MACHINE\<wbr>SECURITY\<wbr>Cache</code>に存在します: * DCC1 ハッシュ (MSCache v1): 弱い MD4 ベース。Windows XP以前。 * DCC2 ハッシュ (MSCache v2) : 弱めの PBKDF2-HMAC-SHA1 ベース。Windows Vista以後<ref>[https://attack.mitre.org/techniques/T1003/005/ OS Credential Dumping: Cached Domain Credentials] MITRE 2025年10月24日</ref>。 2021年にリリースされた Windows 11 以降は Microsoft アカウントが必須となっています。 <!--TODO: Windows Hello、LSA Secrets === パスワードの複雑性をチェックする === === TPMで鍵を隔離する === --> == 既製製品の脆弱性を塞ぐ == まずは弱いところを無くしましょう。 === ソフトウェアアップデートをする === セキュリティの基本はソフトウェアアップデートです。 ==== PCおよびモバイル ==== PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います: ; Windows : システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade --all</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 を搭載したハードウェアはどうすれば良いでしょうか。これには使い続けるいくつかの方法がありますが、基本的にオススメしません。古い OS を搭載していたハードウェアはハードウェア仕様も古いからです。 ==== スタンドアロン運用 ==== 古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。 しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。 ==== 新しめのLinuxを導入 ==== 新しめのLinuxを導入するという方法もあります。 これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。 またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。 ==== 手放す ==== 手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。 == 不要なサービスを止める / 削除する == {| class="wikitable" |+ サービス表示系コマンド |- ! 稼働中のシステムサービスを見る | <code>systemctl --type=service --state=running</code> |- ! 稼働中のユーザーサービスを見る | <code>systemctl --user --type=service --state=running</code> |} === TCP/UDP経由のサービス === TCP/UDPでのポート待ち受けのあるプロセスを見るには <code>sudo ss -tulnp</code> を、通信しているプロセスを見るには <code>sudo lsof -i -P -n</code> を実行しましょう。 {| class="wikitable" |+ 主なポート待ち受けのあるプロセス |- ! ポート !! 機能 !! プロセス名 !! サービス名または起動コマンド !! パッケージ名 (Ubuntu) || 直接問い合せコマンド |- | rowspan=2 | 53/UDP<br>53/TCP || rowspan=2 | DNS(名前解決) || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>dig @127.0.0.53 example.com</code> |- | dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>dig @10.208.199.1 example.com</code> |- | rowspan=2 | 5353/UDP || rowspan=2 | [[:w:マルチキャストDNS|マルチキャストDNS]] || systemd-resolved || systemd-resolved.service || systemd-resolved || <code>resolvectl -p mdns query $HOSTNAME.local</code> |- | Avahi || avahi-daemon.service || avahi-daemon || <code>avahi-resolve-host-name $HOSTNAME.local</code> |- | 67/UDP<br>547/UDP || [[:w:DHCP|DHCP]]<br>[[:w:DHCPv6|DHCPv6]] || dnsmasq || dnsmasq.service<br/>dnsmasq@.service || dnsmasq-base<br>dnsmasq || <code>IP=$(ip -4 -o addr show pan1 &vert; grep -oP '(?<=inet )[\d.]+'); sudo dhcping -v -i -s "$IP" -c "$IP"</code>{{efn|Ubuntuではdhcpingパッケージの導入が必要です。}} |- | rowspan=2 | 68/UDP<br>546/UDP || rowspan=2 | DHCPクライアント<br>DHCPv6クライアント{{efn|単独のDHCPクライアントである dhclient、dhcpcd なども存在する。また開発終了になったisc-dhcp-clientも存在した。}} || systemd-networkd<wbr>{{efn|name="network-all"}} || || systemd || |- | NetworkManager<wbr>{{efn|name="network-all"|ネットワーク管理全般を担当しています。}} || NetworkManager.service || network-manager || |- | rowspan=2 | 123/UDP<br>4460/TCP || rowspan=2 | NTP(時刻同期)<br>NTS-KE (NTPの鍵交換){{efn|これらの代替として systemd-timesyncd もありますが、こちらは NTP の代わりに単純な SNTP のみ実装の上、サーバーを持たずクライアント側のみ対応です。}} || ntpd || ntpsec.service || ntpsec || rowspan=2 | <code>ntpdig localhost</code>{{efn|ローカルへのNTP問い合せは<code>ntpdate -q localhost</code>でもできますが、こちらはNTP-KE非対応です。}} |- | chronyd || chrony.service || chrony |- | 80/TCP<br>443/HTTP<br>443/UDP || HTTP<br>HTTPS<br>HTTP/3 (QUIC) || apache2 || apache2.service<br>apache2@.service<br>httpd.service<br>httpd@.service || apache2 || HTTP: <code>curl http://localhost</code><br>HTTPS: <code>curl --http2 https://localhost</code><br>HTTP/3: <code>curl --http3-only https://localhost</code> |- | rowspan=2 | ユーザーポート/UDP || rowspan=2 | HTTP/3 (QUIC) クライアント<br>WebRTCクライアント || chrome{{efn|Google Chrome}} || <code>google-chrome</code> || google-chrome (公式APTリポジトリ) || |- | firefox{{efn|Mozzila Firefox}} || <code>firefox</code> || firefox (snap) || |- | rowspan=2 |21/TCP<br>20/TCP{{efn|アクティブモードのみデータ転送で使われます。}} || rowspan=2 | FTP || proftpd || proftpd.service<br>proftpd@.service || proftpd-core || rowspan=2 | <code>curl ftp://localhost</code> |- | vsftpd || vsftpd.service || vsftpd |- | 22/TCP || SSH / SFTP || sshd || ssh.service<br>sshd@.service || openssh-server || <code>ssh-keyscan 127.0.0.1</code> |- | rowspan=2 | 6881/TCP || rowspan=2 | BitTorrent || qbittorrent || <code>qbittorrent</code> || qbittorrent || |- | ktorrent || <code>ktorrent</code> || ktorrent || |- | rowspan=2 | 51413/TCP || rowspan=2 | Transmission<wbr>{{efn|BitTorrentプロトコル。TransmissionをベースとするFragmentsも同ポートを使用します。}} || transmission-daemon || transmission-daemon.service || transmission-daemon || |- | transmission-gtk || <code>transmission-gtk</code> || transmission-gtk || |- | 5001/TCP<br>5001/UDP || rowspan=2| ネットワークパフォーマンス計測 || iperf || <code>iperf -s</code> || iperf || <code>iperf -c localhost</code> |- | 5021/TCP<br>5021/UDP || iperf3 || <code>iperf3 -s</code> || iperf3 || <code>iperf3 -c localhost</code> |- | 1716/UDP<br>1716/TCP<br>ユーザーポート/UDP || スマートフォン連携 (KDE) || kdeconnectd || <code>kdeconnect-app</code> || kdeconnect || |- | ユーザーポート/TCP || Claude Proxy Service || code{{efn|[[:w:Visual Studio Code|Visual Studio Code]]のプロセス。}} || <code>code</code> || code (公式APTリポジトリ) || <!-- |- | || AI コーディング支援 (Google Antigravity CLI{{efn|Command Line Interface}}) || agy || || (Visal Studio Code拡張) || --> |- | rowspan=2 | 3389/TCP<br>3389/UDP || rowspan=2 | Remote Desktop Protocol || gnome-remote-desktop-daemon{{efn|GNOME Remote Desktop}} || gnome-remote-desktop.service<!-- (system)--><br>gnome-remote-desktop.service (user)<br>gnome-remote-desktop-headless.service (user) || gnome-remote-desktop || |- | krdpserver || app-org.kde.krdpserver.service (user) || krdp || |- | 47984/TCP<br>47989/TCP<br>48010/TCP<br>47998–48010/UDP || NVIDIA GameStream || sunshine || app-dev.<wbr>lizardbyte.<wbr>app.<wbr>Sunshine.service (user) || sunshine (公式debファイル) || (moonlight-qt) |- | 27031-27036/UDP<br>27036/TCP || Steam Remote Play<ref>[https://help.steampowered.com/ja/faqs/view/2EA8-4D75-DA21-31EB Steam接続に必要なポート] Valve</ref> || steam || <code>steam</code> || steam (公式APTリポジトリ) || |- | 1900/UDP || UPnP{{efn|パケットフィルタと共に使用して要求に従ってポートマッピングする。}} || miniupnpd || miniupnpd.service || miniupnpd-nftables<br>miniupnpd-iptables || |} なおUPnPのポートは外側に解放しないようにしましょう。また内側にだけ解放した場合も内側に侵害された機器が存在する場合に危険となるのでVLANでネットワークを分けるなどを心がけましょう。 また外側に開いてるポートはランダム割り当てされないように sysctl の <code>net.ipv4.ip_local_reserved_ports</code> で予約しておきましょう。この設定を永続化するには /etc/sysctl.d/99-local-ports.conf あたりに<code>net.ipv4.ip_local_reserved_ports="a,b,c"</code>と記述すれば OK です。 <!--TODO: CUPS、Postfix、Samba、Wsdd--> === Unix Domain経由のサービス === Unix Domainでのポート待ち受けのあるプロセスを見るには <code>sudo ss -xlp</code> を実行しましょう。 === dbus経由のサービス === システムバスは <code>busctl --system list</code>、セッションバスは <code>busctl --user list</code> で確認することができます。 それらを提供する実行中のプロセスの一覧は以下で取得できます: * システムバスを提供するプロセス: <code>busctl --system --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> * ユーザーバスを提供するプロセス: <code>busctl --user --no-pager | awk 'NR>1 && $2 ~ /^[0-9]+$/ {print $2}' | xargs -I {} readlink "/proc/{}/exe" | sort -u</code> dbusサービスの一部はプロセス未実行のアクティベータブル (activatable) な状態で提供されています。アクティベータブルな状態で提供するサービスの実行コマンドは以下で取得できます: * activatableなシステムバスの実行コマンド: <code>busctl --system --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> * activatableなユーザーバスの実行コマンド: <code>busctl --user --no-pager --activatable | awk '{print $1}' | xargs -I {} find /usr/share/dbus-1 -name "{}.service" | xargs grep -h "Exec=" | sed 's/Exec=//g' | sort -u</code> == 潜在的な脆弱性を減らす == 現代のプログラムでは以下のような保護が行われています。 === メモリアドレスの推測困難化 === 攻撃に必要なコード片(ガジェット)のメモリアドレスを推測しにくくするために、カーネル空間、ユーザー空間の両方で[[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)が行われています。カーネル空間の ASLR は KASLR (Kernel ASLR) とも呼ばれています。 ユーザー空間のプログラムで ASLR を有効にするためには[[:w:位置独立コード|位置独立コード]] (PIC) / 位置独立実行形式 (PIE) である必要があります。Unix で使われる実行形式の ELF では位置独立実行形式が ET_DYN、非位置独立実行形式 (non-PIE) が ET_EXEC となります。 Linuxでは ASLR が無効となる非位置独立実行形式のファイルを以下で検索することができます: <syntaxhighlight lang="shell-session"> $ # License: CC0 / Public Domain $ # 非位置独立実行形式 (non-PIE) のバイナリを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' /usr/lib/default.sfx /usr/lib/klibc/bin/mkfifo /usr/lib/klibc/bin/zcat /usr/lib/klibc/bin/poweroff [...] $ # 非位置独立実行形式 (non-PIE) のバイナリを含むDebianパッケージを検索 $ find / -type f -executable 2>/dev/null | xargs -I {} sh -c 'LANG=C readelf -h {} 2>/dev/null | grep -E "Type:.*EXEC" >/dev/null && echo {}' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u aidl busybox-static code cpp-15-x86-64-linux-gnu cuda-gdb-13-4 cuda-nvcc-13-4 cuda-sanitizer-13-4 cuda-tileiras-13-4 debugedit g++-15-x86-64-linux-gnu gcc-15-x86-64-linux-gnu gcc-mingw-w64-i686-posix gdc-15-x86-64-linux-gnu gds-tools-13-4 gfortran-15-x86-64-linux-gnu gh git-lfs gobjc-15-x86-64-linux-gnu gocryptfs golang-1.26-go go-md2man go-mtpfs [...] </syntaxhighlight> 現在のLinuxカーネルがユーザー空間 ASLR を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ sysctl kernel.randomize_va_space # 0=無し、1=部分的、2=完全 kernel.randomize_va_space = 2 </syntaxhighlight> また現在のLinuxカーネルがカーネル ASLR (KASLR) を有効にしているかは以下で確認できます (出力例はUbuntu 26.04): <syntaxhighlight lang="shell-session"> $ grep 'CONFIG_RANDOMIZE_BASE' /boot/config-$(uname -r) # y=Yes, n=No CONFIG_RANDOMIZE_BASE=y </syntaxhighlight> なお ASLR は間接的な関数呼び出し( C++ の vtable を含む)があると、そのアドレスから ASLR のオフセットがバレてしまい突破されてしまいます。 また CPU の[[:w:投機的実行|投機的実行]]での情報漏れ (Spectre) による[[:w:キャッシュ攻撃|キャッシュサイドチャネル攻撃]](後述)の一つである「投機的探査」 (BlindSide) によってもコードの位置情報の取得がされ ASLR が突破されてしまいます。 === 投機的実行の情報漏れ防止 === 前述のとおり、投機的実行による情報漏れ (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。}}およびそれを高速化した「拡張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 '_RWX' /boot/config-$(uname -r) # y=Yes, n=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, n=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 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' /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 [...] $ # 間接分岐追跡またはシャドウスタックが無効化されているバイナリを含むDebianパッケージを検索 $ find / -type f 2>/dev/null | xargs -I {} sh -c 'readelf -h "{}" >/dev/null 2>&1 && (readelf -n "{}" 2>/dev/null | grep -E IBT,.*SHSTK > /dev/null || echo "{}")' | xargs -r -d '\n' -n1 dpkg-query -S | sed 's/: .*//' | sort -u 7zip aidl ardour avr-libc cargo-1.93 carla carla-bridge-wine32:i386 carla-bridge-wine64 carla-lv2 carla-vst cuda-ctadvisor-13-4 cuda-cudart-13-4 [...] </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 --> == 不審な改変が行われていないかを調べる == 例えばOSの起動には一連のシーケンスがありますが、マルウェアは基本的にここの途中に入り込んで永続化します。 {| class="wikitable" |+ 起動シーケンス |- ! 種類 || Windows 11以降 !! Linux (Gnome) !! Linux (KDE) |- | 1. 起動ファームウェア || [[:w:Unified Extensible Firmware Interface|UEFI]] || colspan=2 | [[:w:Basic Input/Output System|レガシーBIOS]] / UEFI |- | 2. ブートローダー || [[:w:Windows Boot Manager|Windows Boot Manager]] (bootmgfw.efi)<br> → [[:w:Windows Boot Manager#winload.exe/winload.efi|Windows OS Loader]] (winload.efi) || colspan=2 | GRUB{{efn|Ubuntuの標準。}} / systemd-boot / Unified Kernel Image{{efn|Linuxカーネルとブートイメージを単一バイナリにする仕組み。}} / EFI boot stub{{efn|LinuxカーネルをEFIから直接ブートできるようにする仕組み。}} |- | 3. カーネル || [[:w:ntoskrnl.exe|ntoskrnl.exe]] || colspan=2 | Linuxカーネル ([[:w:vmlinux|vmlinux]]{{efn|圧縮後はvmlinuzとなる。}}) |- | 4. 初期化プロセス || [[:w:en:Session Manager Subsystem|smss.exe]]<br> → wininit.exe<br> || rowspan=2 colspan=2 | [[:w:systemd|systemd]]{{efn|以前は代替initもよく使われていたが、今はsystemdが標準となっている。}} |- | 5. サービスコントロールマネージャ || colspan=2 | [[:w:en:Service Control Manager|services.exe]] |- | rowspan=2 | 6. ログインマネージャ || rowspan=2 | [[:w:Winlogon|winlogon.exe]] || colspan=2 | systemd-logind<br>sd-pam |- | [[:w:GNOME ディスプレイマネージャー|GDM]] || [[:w:Simple Desktop Display Manager|SDDM]] |- | rowspan=2 | 7. ユーザー初期化プロセス || rowspan=2 | userinit.exe || colspan=2 | systemd |- | gnome-session || kcminit<br> → plasma_session |- | 8. シェル || [[:w:Windows Explorer|explorer.exe]] || gnome-shell || plasmashell |- | 9. コンポジタ || [[:w:Desktop Window Manager|dwm.exe]] || mutter || kwin |} また起動シーケンス以外にもアップデートシーケンスへの感染やシェル感染、ブラウザ感染もあります。 {| 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/]{{efn|systemd-xdg-autostart-generator が導入されているシステムではこれらがsystemd設定に自動変換される。}} || ~/.config/autostart/* || /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>で確認可能。}} |} === パッケージ管理ファイルを検証する === パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です: {| class="wikitable" |- ! OS / パッケージシステム !! 検証のみ !! 修復 |- | Windows || <code>sfc&nbsp;/verifyonly</code> || <code>sfc&nbsp;/scannow</code> |- | Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs &verbar; xargs -r dpkg-query -S &verbar; cut -d: -f1 &verbar; sort -u)</code> |- | RPMパッケージ (RedHat / Fedora) || <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>で削除しましょう。 またaptレポジトリに無いインストールされたパッケージは<code>apt list '?obsolete'</code>で、手動 (manual) でインストールされたパッケージは<code>apt-mark showmanual</code>で確認できます。これらのコマンドを実行してインストールした覚えないパッケージが入ってないかをチェックしましょう。GUI が使えるのであれば<code>synaptic</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 における代表的なユーザースクリプト、コマンド起動、DLL呼び出しが可能なレジストリ |- ! 規格/アプリケーション !! 各ユーザー !! 全ユーザー |- | 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:Security Account Manager|Security Account Manager]] || || HKEY_LOCAL_MACHINE\<wbr>SAM\<wbr>SAM\<wbr>Domains\<wbr>Account\<wbr>Users\<wbr>*\<wbr>V{{efn|name="sam"|'HKEY_LOCAL_MACHINE\SAM\SAM\' 以下はレジストリエディタの右クリックの「アクセス許可」で Administrators にアクセス許可を与えないと読めない。なおファイルパスは「C:\Windows\System32\config\SAM」。}}{{efn|Vはバイナリであり、0xCC + (0x60 に指定されたオフセット) からユーザーログオンスクリプトパスを指定する<ref name="sam-ghost">Sebastián R. Castro et al. [https://dl.acm.org/doi/pdf/10.1145/3689934.3690839 Ghost in the SAM: Stealthy, Robust, and Privileged Persistence through Invisible Accounts] ACM 2024年</ref>。}} |- | [[:w:en:Local Security Authority Subsystem Service|Local Security Authority Subsystem Service]] || || HKEY_LOCAL_MACHINE\<wbr>System\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Notification Packages<br>HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>Control\<wbr>LSA\<wbr>Authentication Packages<ref>[https://attack.mitre.org/detectionstrategies/DET0207/ Detect LSA Authentication Package Persistence via Registry and LSASS DLL Load] MITRE Corporation</ref> |- | [[: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<ref>[https://attack.mitre.org/techniques/T1547/014/ Boot or Logon Autostart Execution: Active Setup] MITRE Corporation</ref> |- | [[: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]] || || 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<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Notify<ref>[https://attack.mitre.org/techniques/T1547/004/ Boot or Logon Autostart Execution: Winlogon Helper DLL] MITRE Corporation</ref> |- | [[: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:AutoRun|AutoRun]]) ファイルにもマルウェアが紛れてないか注意しましょう。 {| class="wikitable" |+ メディアの自動実行ファイル |- ! Windows !! Linux<br>(Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/]) |- | *:\[[:w:autorun.inf|autorun.inf]] || /media/*/*/.autorun<br>/media/*/*/autorun<br>/media/*/*/autorun.sh<br>/run/media/*/*/.autorun<br>/run/media/*/*/autorun<br>/run/media/*/*/autorun.sh |} == 改変を防ぐ == 改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。 改ざんを防ぐには「[[: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>grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r)</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"> $ grep 'CONFIG_MODULE_SIG=' /boot/config-$(uname -r) # 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 === キャプチャー・ザ・フラッグに偽装する === 実際の攻撃をコンピュータセキュリティの競技の一つ「[[:w:キャプチャー・ザ・フラッグ|キャプチャー・ザ・フラッグ]]」(CTF) に偽装して止めるという手法が存在します。 キャプチャー・ザ・フラッグで良く使われるファイルには以下が存在します: * /.env<ref name="aps-ctf-writeup"/> * /flag.txt<ref name="aps-ctf-writeup">[https://www.appsecmaster.net/blog/ctf-writeup/ CTF Writeup Guide - Template and Real Web Exploit Examples] AppSecMaster</ref> * /flag<ref name="aps-ctf-writeup"/> * /app/flag.txt<ref name="aps-ctf-writeup"/> * /home/ctf/flag.txt<ref name="aps-ctf-writeup"/> * /var/www/flag.txt<ref name="aps-ctf-writeup"/> * /root/flag.txt * /tmp/flag.txt * /opt/flag.txt === ハニーポット === ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「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>。 <!-- == 自作コードの脆弱性を塞ぐ == 書きかけ --> == 被害を受けても復旧しやすくする == === バックアップを取る === バックアップでは複数世代でオフラインバックアップを取ってください。バックアップの媒体には例えば以下が存在します: * 外付けHDD * RDXデータカートリッジ * LTOテープ === 書き込み時コピーのファイルシステムを使う === コピー・オン・ライト(書き込み時コピー、CoW) のファイルシステム(btrfs、ZFS)では書き込みが既存のデータと別の場所に保存されるため、ファイルが破壊された場合でも復元できる確率が上がります。 しかしながらそれらのファイルシステムの構造を把握して破壊する高度なマルウェアには無効です。 === クリーンな環境を用意しておく === 復旧用として侵害されにくいクリーンな環境を用意しておきましょう。 == 被害からの復旧 == === ランサムウェア被害からの復旧 === ランサムウェア(身代金要求型マルウェア)はファイルの暗号化を行います。 復旧のためには決して'''電源を落とさないでください'''。まずはLANケーブルを抜いた後、<code>iotop</code>コマンドからI/Oの多いプロセスを特定したりなどして<code>kill -STOP</code>で怪しいプロセスを全て停止させてください。これによって暗号化に使われた鍵がメモリ内に残ります。 次にそのメモリをダンプして外部に保存してください。 * /dev/mem ファイルからのメモリダンプ(モダンなLinuxでは非対応{{efn|/dev/mem からの Linux カーネル全域/ユーザーランドのメモリダンプには Linux カーネルが CONFIG_DEVMEM&#61;y かつ CONFIG_STRICT_DEVMEM&#61;n でコンパイルされている必要があります。}}) ** 直接ダンプする (<code>dd if=/dev/mem ...</code>) ** AVML (Acquire Volatile Memory for Linux)[https://github.com/microsoft/avml]を使う * カーネルモジュールによるメモリダンプ ** lime.ko (LiME, Linux Memory Extractor) [https://github.com/jtsylve/LiME]を使う(Debian/Ubuntu では lime-forensics-dkms パッケージ{{efn|DKMS経由のカーネルモジュール導入は、UEFI セキュアブートなどで Linux カーネルのロックダウンが有効の場合 (<code>cat /sys/kernel/security/lockdown</code> が integrity または confidentiality の場合)、Machine-Owner Key (MOK) の有効化が必要となります。MOK の鍵が無効になっている場合は再起動後に MokManager から MOK の鍵を有効にする必要があるため、MOK の鍵が無効かつ再起動が不可能な場合は lime-forensics-dkms を使うことはできません。また MOK を有効にした場合はカーネルロックダウンが無意味になる(root権限があれば悪意のあるカーネルモジュールに署名して読み込ませられるようになるため、root権限とカーネルモードのセキュリティ境界が無くなる<ref>[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}}) <!--TODO: 未検証 * eBPF プログラムによるメモリダンプ ** emd[https://github.com/ph0llux/emd] - 未検証 --> 最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。 * C3RB3R向け: https://github.com/soimy/c3rb3r-rescue なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。 == 脚注 == <references group="注釈"/> == 参考文献 == <references/> {{DEFAULTSORT:こんひゆうたせきゆりてい}} [[Category:計算機科学]] [[Category:情報技術]] f8g83lthdmx82qcn8t2ftvbaypmu8b3 論語/巻第三 雍也第六 0 48972 305166 2026-10-29T13:28:08Z Tomzo 248 新規 305166 wikitext text/x-wiki 主要テーマ :仁を中心に、学問・徳・知恵を兼ね備えた君子のあり方を説く。 == 各章 == #子曰:「雍也、可使南面。」仲弓問子桑伯子。子曰:「可也、簡。」仲弓曰:「居敬而行簡、以臨其民、不亦可乎。居簡而行簡、無乃大簡乎。」子曰:「雍之言然。」 #哀公問:「弟子孰為好學。」孔子對曰:「有顏回者、好學;不遷怒、不貳過、不幸短命死矣。今也則亡、未聞好學者也。」 #子華使於齊、冉子為其母請粟。子曰:「與之釜。」請益、曰:「與之庾。」冉子與之粟五秉。子曰:「赤之適齊也、乘肥馬、衣輕裘;吾聞之也:君子周急不繼富。」原思為之宰、與之粟九百、辭。子曰:「毋。以與爾鄰里鄉黨乎。」 #子謂仲弓曰:「犁牛之子、騂且角;雖欲勿用、山川其舍諸。」 #子曰:「回也、其心三月不違仁。其餘、則日月至焉而已矣。」 #季康子問:「仲由可使從政也與。」子曰:「由也果、於從政乎何有。」曰:「賜也可使從政也與。」曰:「賜也達、於從政乎何有。」曰:「求也可使從政也與。」曰:「求也藝、於從政乎何有。」 #季氏使閔子騫為費宰。閔子騫曰:「善為我辭焉。如有復我者、則吾必在汶上矣。」 #伯牛有疾、子問之、自牖執其手、曰:「亡之、命矣夫。斯人也、而有斯疾也。斯人也、而有斯疾也。」 #子曰:「賢哉回也。一簞食、一瓢飮、在陋巷、人不堪其憂、回也不改其樂。賢哉回也。」 #冉求曰:「非不說子之道、力不足也。」子曰:「力不足者、中道而廢;今女畫。」 #子謂子夏曰:「女為君子儒、無為小人儒。」 #子游為武城宰。子曰:「女得人焉耳乎。」曰:「有澹臺滅明者、行不由徑;非公事、未嘗至於偃之室也。」 #子曰:「孟之反不伐、奔而殿、將入門、策其馬、曰:『非敢後也、馬不進也。』」 #子曰:「不有祝鮀之佞、而有宋朝之美、難乎免於今之世矣。」 #子曰:「誰能出不由戶。何莫由斯道也。」 #子曰:「質勝文則野、文勝質則史。文質彬彬、然後君子。」 #子曰:「人之生也直、罔之生也幸而免。」 #子曰:「知之者、不如好之者、好之者、不如樂之者。」 #子曰:「中人以上、可以語上也;中人以下、不可以語上也。」 #樊遲問知。子曰:「務民之義、敬鬼神而遠之、可謂知矣。」問仁。曰:「仁者先難而後獲、可謂仁矣。」 #子曰:「知者樂水、仁者樂山。知者動、仁者靜。知者樂、仁者壽。」 #子曰:「齊一變、至於魯;魯一變、至於道。」 #子曰:「觚不觚、觚哉。觚哉。」 #宰我問曰:「仁者雖吿之曰:『井有仁焉。』其從之也。」子曰:「何為其然也。君子可逝[1]也、不可陷也。可欺也、不可罔也。」 #子曰:「君子博學於文、約之以禮、亦可以弗畔矣夫。」 #子見南子、子路不說。夫子矢之曰:「予所否者、天厭之。天厭之。」 #子曰:「中庸之為德也、其至矣乎。民鮮久矣。」 #子貢曰:「如有博施於民、而能濟眾、何如。可謂仁乎。」子曰:「何事於仁、必也聖乎。堯舜其猶病諸。夫仁者、己欲立而立人、己欲達而達人。能近取譬、可謂仁之方也已。」 {{stub|論語}} [[Category:論語|ようや]] 536m5lw459zqi2szhc5u21q3ou8gt14 305169 305166 2026-10-29T17:45:44Z Tomzo 248 /* 各章 */ 305169 wikitext text/x-wiki 主要テーマ :仁を中心に、学問・徳・知恵を兼ね備えた君子のあり方を説く。 == 各章 == #子曰:「雍也、可使南面。」仲弓問子桑伯子。子曰:「可也、簡。」仲弓曰:「居敬而行簡、以臨其民、不亦可乎。居簡而行簡、無乃大簡乎。」子曰:「雍之言然。」 #哀公問:「弟子孰為好學。」孔子對曰:「有顏回者、好學;不遷怒、不貳過、不幸短命死矣。今也則亡、未聞好學者也。」 #子華使於齊、冉子為其母請粟。子曰:「與之釜。」請益、曰:「與之庾。」冉子與之粟五秉。子曰:「赤之適齊也、乘肥馬、衣輕裘;吾聞之也:君子周急不繼富。」原思為之宰、與之粟九百、辭。子曰:「毋。以與爾鄰里鄉黨乎。」 #子謂仲弓曰:「犁牛之子、騂且角;雖欲勿用、山川其舍諸。」 #子曰:「回也、其心三月不違仁。其餘、則日月至焉而已矣。」 #季康子問:「仲由可使從政也與。」子曰:「由也果、於從政乎何有。」曰:「賜也可使從政也與。」曰:「賜也達、於從政乎何有。」曰:「求也可使從政也與。」曰:「求也藝、於從政乎何有。」 #季氏使閔子騫為費宰。閔子騫曰:「善為我辭焉。如有復我者、則吾必在汶上矣。」 #伯牛有疾、子問之、自牖執其手、曰:「亡之、命矣夫。斯人也、而有斯疾也。斯人也、而有斯疾也。」 #子曰:「賢哉回也。一簞食、一瓢飮、在陋巷、人不堪其憂、回也不改其樂。賢哉回也。」 #冉求曰:「非不說子之道、力不足也。」子曰:「力不足者、中道而廢;今女畫。」 #子謂子夏曰:「女為君子儒、無為小人儒。」 #子游為武城宰。子曰:「女得人焉耳乎。」曰:「有澹臺滅明者、行不由徑;非公事、未嘗至於偃之室也。」 #子曰:「孟之反不伐、奔而殿、將入門、策其馬、曰:『非敢後也、馬不進也。』」 #子曰:「不有祝鮀之佞、而有宋朝之美、難乎免於今之世矣。」 #子曰:「誰能出不由戶。何莫由斯道也。」 #[[/第十六|第十六]] #:子曰:「質勝文則野、文勝質則史。文質彬彬、然後君子。」 #::子曰く、質の文に勝れるは、則ち野なり。文の質に勝れるは、則ち史なり。文質彬彬として、然る後に君子たり。 #子曰:「人之生也直、罔之生也幸而免。」 #子曰:「知之者、不如好之者、好之者、不如樂之者。」 #子曰:「中人以上、可以語上也;中人以下、不可以語上也。」 #樊遲問知。子曰:「務民之義、敬鬼神而遠之、可謂知矣。」問仁。曰:「仁者先難而後獲、可謂仁矣。」 #子曰:「知者樂水、仁者樂山。知者動、仁者靜。知者樂、仁者壽。」 #子曰:「齊一變、至於魯;魯一變、至於道。」 #子曰:「觚不觚、觚哉。觚哉。」 #宰我問曰:「仁者雖吿之曰:『井有仁焉。』其從之也。」子曰:「何為其然也。君子可逝[1]也、不可陷也。可欺也、不可罔也。」 #子曰:「君子博學於文、約之以禮、亦可以弗畔矣夫。」 #子見南子、子路不說。夫子矢之曰:「予所否者、天厭之。天厭之。」 #子曰:「中庸之為德也、其至矣乎。民鮮久矣。」 #子貢曰:「如有博施於民、而能濟眾、何如。可謂仁乎。」子曰:「何事於仁、必也聖乎。堯舜其猶病諸。夫仁者、己欲立而立人、己欲達而達人。能近取譬、可謂仁之方也已。」 {{stub|論語}} [[Category:論語|ようや]] 5q3t78ztexgz9pifoazs7xy1fjnupap 論語/巻第三 雍也第六/第十六 0 48973 305168 2026-10-29T17:41:15Z Tomzo 248 新規 305168 wikitext text/x-wiki ==本文== <div style="text-align: center;"> <div style="display: inline-block; text-align: left;"> <small> {{#invoke:Kanbun|kanbun| 子曰{いはク}、\\  質{ノ}勝{まさレルハ}[レ]文{ニ}則{チ}野{やナリ}、\\  文{ノ}勝{まさレルハ}[レ]質{ニ}則{チ}史{しナリ}。\\  文質彬{ひん}彬{ぴんトシテ}、\\  然{しかル}後{二}君子{タリ}。 }} </small> </div> </div> == 訓読文と語釈等 == <div> {| class="wikitable" style="width:100%;" |+ ! style="width:35%;" | 訓読文 ! style="width:65%;" | 語釈等 |- |style="vertical-align:top"|<big> {{ruby|子|し}}{{ruby|曰|いは}}く、 :質<ref group="†">本質。人格の基底をなすもの。徳性。</ref>の文<ref group="†">文字・文章の意味ではなく、外のかざり、磨き。知識、技能、礼儀作法、等々の意。「文」は元々「文様」に見られるように衣装・デザインを意味、文字の意味は、見た目を象った(象形文字)ことから発生した。</ref>に勝れるは、則ち野<ref group="†">野卑・野暮・野蛮、すなわち洗練されていないこと。</ref>なり。 :文の質に勝れるは、則ち史<ref group="†">ここでは、「吏〈『史』の上部に棒を足したもの〉」と同義で小役人の意味。「史」は「中 + 又(手)」で文書を書き留めること・書き留める人を意味し後に書き留めたれた文書(=歴史)を意味するようになった。文書を書き留めるだけの役人は「史生」と呼ばれ駆け出しの役人とされた。</ref>なり。 : 文質彬彬<ref group="†">「彬」は元々「明らかで目立つこと、見栄えがすること」の意。説文解字には「份(揃えて分ける)」の異体字とされ、「彬彬」は調和が取れている様とされる。後に、分部が調和が取れている様として「斌」が造字され前漢代の式に用いられている(説文解字には収録されていない)。</ref>として、然る後に君子たり。 |style="vertical-align:top"|<small><references group="†"/></small> |} </div> == 現代語和訳 == [[w:下村湖人|下村湖人]][https://www.aozora.gr.jp/cards/001097/files/43785_58836.html 『現代訳論語』(青空文庫)より] :先師がいわれた。―― ::質がよくても文がなければ一個の野人に過ぎないし、文は十分でも、質がわるければ、気のきいた事務家以上にはなれない。文と質とがしっかり一つの人格の中に溶けあった人を君子というのだ。 == 解説 == 相手に対して、如何に誠実な思い([[論語/巻第二 里仁第四/第十五|心底からの真心(忠恕)]])を持っていたとしても、態度や言葉遣いに気を遣わないようであれば、それは野鄙に見えその誠実な想いは伝わらない。逆に、態度や言葉遣いに場から気を取られて相手への配慮などに思いが欠けるようであれば、それは小役人の態度であって小賢しい限りである。物事の内なる本質('''質''')とそれを外にアピールすること('''文''')はバランスが取れて初めて立派な人(君子)ということができる、と説く。 どちらかといえば、型(「文」)は習い覚えれば備えることができるので、そればかりを重視する弟子たちへの戒めと考えて良いが([[論語/巻第六 先進第十一/第一|先進第十一/第一]]参照)、「文(その型をまとめたものが『礼』であると言ってよい)」を軽視する弟子たち([[論語/巻第三 公冶長第五/第六|公冶長第五/第六]]、[[論語/巻第六 先進第十一/第十四|先進第十一/第十四]]参照)に対しても反省を促している。 == 関連 == == 脚注 == <small><references /></small> [[Category:高等学校教育_国語_漢文|ようや]] [[category:論語|ようや16]] olbplpbp5n0qci3gtb0v3kyautwh5al 305175 305168 2026-10-30T04:34:09Z Tomzo 248 /* 訓読文と語釈等 */ 305175 wikitext text/x-wiki ==本文== <div style="text-align: center;"> <div style="display: inline-block; text-align: left;"> <small> {{#invoke:Kanbun|kanbun| 子曰{いはク}、\\  質{ノ}勝{まさレルハ}[レ]文{ニ}則{チ}野{やナリ}、\\  文{ノ}勝{まさレルハ}[レ]質{ニ}則{チ}史{しナリ}。\\  文質彬{ひん}彬{ぴんトシテ}、\\  然{しかル}後{二}君子{タリ}。 }} </small> </div> </div> == 訓読文と語釈等 == <div> {| class="wikitable" style="width:100%;" |+ ! style="width:35%;" | 訓読文 ! style="width:65%;" | 語釈等 |- |style="vertical-align:top"|<big> {{ruby|子|し}}{{ruby|曰|いは}}く、 :質<ref group="†">本質。人格の基底をなすもの。徳性。</ref>の文<ref group="†">文字・文章の意味ではなく、外のかざり、磨き。知識、技能、礼儀作法、等々の意。「文」は元々「文様」に見られるように意匠・デザインを意味、文字の意味は、見た目を象った(象形文字)ことから発生した。</ref>に勝れるは、則ち野<ref group="†">野卑・野暮・野蛮、すなわち洗練されていないこと。</ref>なり。 :文の質に勝れるは、則ち史<ref group="†">ここでは、「吏〈『史』の上部に棒を足したもの〉」と同義で小役人の意味。「史」は「中 + 又(手)」で文書を書き留めること・書き留める人を意味し後に書き留めたれた文書(=歴史)を意味するようになった。文書を書き留めるだけの役人は「史生」と呼ばれ駆け出しの役人とされた。</ref>なり。 : 文質彬彬<ref group="†">「彬」は元々「明らかで目立つこと、見栄えがすること」の意。説文解字には「份(揃えて分ける)」の異体字とされ、「彬彬」は調和が取れている様とされる。後に、分部が調和が取れている様として「斌」が造字され前漢代の式に用いられている(説文解字には収録されていない)。</ref>として、然る後に君子たり。 |style="vertical-align:top"|<small><references group="†"/></small> |} </div> == 現代語和訳 == [[w:下村湖人|下村湖人]][https://www.aozora.gr.jp/cards/001097/files/43785_58836.html 『現代訳論語』(青空文庫)より] :先師がいわれた。―― ::質がよくても文がなければ一個の野人に過ぎないし、文は十分でも、質がわるければ、気のきいた事務家以上にはなれない。文と質とがしっかり一つの人格の中に溶けあった人を君子というのだ。 == 解説 == 相手に対して、如何に誠実な思い([[論語/巻第二 里仁第四/第十五|心底からの真心(忠恕)]])を持っていたとしても、態度や言葉遣いに気を遣わないようであれば、それは野鄙に見えその誠実な想いは伝わらない。逆に、態度や言葉遣いに場から気を取られて相手への配慮などに思いが欠けるようであれば、それは小役人の態度であって小賢しい限りである。物事の内なる本質('''質''')とそれを外にアピールすること('''文''')はバランスが取れて初めて立派な人(君子)ということができる、と説く。 どちらかといえば、型(「文」)は習い覚えれば備えることができるので、そればかりを重視する弟子たちへの戒めと考えて良いが([[論語/巻第六 先進第十一/第一|先進第十一/第一]]参照)、「文(その型をまとめたものが『礼』であると言ってよい)」を軽視する弟子たち([[論語/巻第三 公冶長第五/第六|公冶長第五/第六]]、[[論語/巻第六 先進第十一/第十四|先進第十一/第十四]]参照)に対しても反省を促している。 == 関連 == == 脚注 == <small><references /></small> [[Category:高等学校教育_国語_漢文|ようや]] [[category:論語|ようや16]] r4ou30wvz85ajjh40d98mmwqtp6sijc 305188 305175 2026-10-30T08:03:27Z Tomzo 248 /* 訓読文と語釈等 */ 305188 wikitext text/x-wiki ==本文== <div style="text-align: center;"> <div style="display: inline-block; text-align: left;"> <small> {{#invoke:Kanbun|kanbun| 子曰{いはク}、\\  質{ノ}勝{まさレルハ}[レ]文{ニ}則{チ}野{やナリ}、\\  文{ノ}勝{まさレルハ}[レ]質{ニ}則{チ}史{しナリ}。\\  文質彬{ひん}彬{ぴんトシテ}、\\  然{しかル}後{二}君子{タリ}。 }} </small> </div> </div> == 訓読文と語釈等 == <div> {| class="wikitable" style="width:100%;" |+ ! style="width:35%;" | 訓読文 ! style="width:65%;" | 語釈等 |- |style="vertical-align:top"|<big> {{ruby|子|し}}{{ruby|曰|いは}}く、 :質<ref group="†">本質。人格の基底をなすもの。徳性。</ref>の文<ref group="†">文字・文章の意味ではなく、外のかざり、磨き。知識、技能、礼儀作法、等々の意。「文」は元々「文様」に見られるように意匠・デザインを意味、文字の意味は、見た目を象った(象形文字)ことから発生した。</ref>に勝れるは、則ち野<ref group="†">野卑・野暮・野蛮、すなわち洗練されていないこと。</ref>なり。 :文の質に勝れるは、則ち史<ref group="†">ここでは、「吏〈『史』の上部に棒を足したもの〉」と同義で小役人の意味。「史」は「中 + 又(手)」で文書を書き留めること・書き留める人を意味し後に書き留められた文書(=歴史)を意味するようになった。文書を書き留めるだけの役人は「史生」と呼ばれ駆け出しの役人とされた。</ref>なり。 : 文質彬彬<ref group="†">「彬」は元々「明らかで目立つこと、見栄えがすること」の意。説文解字には「份(揃えて分ける)」の異体字とされ、「彬彬」は調和が取れている様とされる。後に、分部が調和が取れている様として「斌」が造字され前漢代の式に用いられている(説文解字には収録されていない)。</ref>として、然る後に君子たり。 |style="vertical-align:top"|<small><references group="†"/></small> |} </div> == 現代語和訳 == [[w:下村湖人|下村湖人]][https://www.aozora.gr.jp/cards/001097/files/43785_58836.html 『現代訳論語』(青空文庫)より] :先師がいわれた。―― ::質がよくても文がなければ一個の野人に過ぎないし、文は十分でも、質がわるければ、気のきいた事務家以上にはなれない。文と質とがしっかり一つの人格の中に溶けあった人を君子というのだ。 == 解説 == 相手に対して、如何に誠実な思い([[論語/巻第二 里仁第四/第十五|心底からの真心(忠恕)]])を持っていたとしても、態度や言葉遣いに気を遣わないようであれば、それは野鄙に見えその誠実な想いは伝わらない。逆に、態度や言葉遣いに場から気を取られて相手への配慮などに思いが欠けるようであれば、それは小役人の態度であって小賢しい限りである。物事の内なる本質('''質''')とそれを外にアピールすること('''文''')はバランスが取れて初めて立派な人(君子)ということができる、と説く。 どちらかといえば、型(「文」)は習い覚えれば備えることができるので、そればかりを重視する弟子たちへの戒めと考えて良いが([[論語/巻第六 先進第十一/第一|先進第十一/第一]]参照)、「文(その型をまとめたものが『礼』であると言ってよい)」を軽視する弟子たち([[論語/巻第三 公冶長第五/第六|公冶長第五/第六]]、[[論語/巻第六 先進第十一/第十四|先進第十一/第十四]]参照)に対しても反省を促している。 == 関連 == == 脚注 == <small><references /></small> [[Category:高等学校教育_国語_漢文|ようや]] [[category:論語|ようや16]] b13qwpab36l6ycqfg6b1o215fuh37wq PHP/PHP2Shell 0 48974 305177 2026-10-30T04:49:25Z Ef3 694 2026年10月21日、PHP公式開発チームはPHPの内部処理に起因する、深刻度「Critical」の重大な脆弱性2件(通称:PHP2Shell)に関するセキュリティリリースを公開しました。認証なしでリモートから任意のコード(シェルコマンド等)が実行される危険性があり、広範な影響を与えました。 305177 wikitext text/x-wiki 2026年10月21日、PHP公式開発チームはPHPの内部処理に起因する、深刻度「Critical」の重大な脆弱性2件(通称:'''PHP2Shell''')に関するセキュリティリリースを公開しました。認証なしでリモートから任意のコード(シェルコマンド等)が実行される危険性があり、広範な影響を与えました。 == 概要 == 「PHP2Shell」は、セキュリティ研究者が認証なしでの遠隔コード実行(RCE)を実証する過程で用いたエクスプロイトに関連付けられた総称であり、主に以下の2件の脆弱性(CVE)で構成されています。 * '''CVE-2026-109618''' * '''CVE-2026-109619''' いずれの脆弱性も共通してCVSS v4.0ベースで '''9.2(Critical)''' と評価されており、第三者が細工したリクエストを送信することで、ターゲットサーバー上で意図しないコマンド実行を引き起こす恐れがあります。 == 影響範囲と特徴 == * '''認証の有無''': 認証を経ることなくリモートからのコード実行が可能。 * '''影響を受けるシステム''': PHPをインタプリタとして動作させている各種Webアプリケーションやサーバー環境。WordPressなどのCMS自体に問題があるのではなく、PHPランタイム(本体)の脆弱性であるため、PHP自体のアップデートが不可欠となります。 == 修正バージョン == PHP開発チームにより、各アクティブブランチに対するセキュリティパッチ適用済みの修正版が緊急リリースされました。 * '''PHP 8.2系''': <code>8.2.35</code> 以降 * '''PHP 8.3系''': <code>8.3.36</code> 以降 * '''PHP 8.4系''': <code>8.4.27</code> 以降 * '''PHP 8.5系''': <code>8.5.12</code> 以降 == 対策と対応手順 == 根本的な解決策は、PHPランタイムを速やかに脆弱性修正済みのバージョンへアップデートすることです。 # '''利用バージョンの確認''': 現在稼働している環境のPHPバージョンを把握する。 # '''パッケージのアップデート''': OSのパッケージマネージャーやPHPのバージョン管理ツール等を使用し、修正版(上記バージョン以降)へ更新する。 # '''影響箇所の棚卸しとログ確認''':公開前段階での情報流出や、不審なアクセスログ・予期せぬプロセス起動履歴がないか確認する。 [[Category:PHP]] 2rn3ft26mtb2tm3d8lay0z1k4f4odbq 305178 305177 2026-10-30T04:57:05Z Ef3 694 解説の詳細化 305178 wikitext text/x-wiki 2026年10月21日、PHP公式開発チームおよびPHP Foundationは、PHPのコア内部(メモリ管理およびエラー処理機構)に起因する、深刻度「Critical」の重大な脆弱性2件に関する緊急セキュリティリリース(PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35)を公開しました。 == 脆弱性の詳細 == 今回のセキュリティリリースでは、認証なしでリモートから任意のコード実行(RCE)を引き起こす可能性のある以下の2件の脆弱性(CVE)が修正されました。 * '''CVE-2026-109618(GHSA-w8hw-w9fx-j79w): OOM(Out-of-Memory)破損に起因するRCE''' ** '''メカニズム''': リクエスト処理中にPHPの <code>memory_limit</code> に不適切なタイミングで到達した場合、不完全に初期化された内部データが有効なものとして扱われてしまい、メモリ破損が発生します。 ** '''影響''': Apache + <code>mod_php</code> 環境では、アプリケーションコードが実行される前段階かつ認証なしのリクエストによってトリガーされ、デフォルト設定のままで完全なリモートコード実行が可能であることが実証されました。また、PHP-FPM環境でもアプリケーションレベルのコードパスを経由してリモートコード実行が確認されています。 * '''CVE-2026-109619(GHSA-6wmf-4rv5-p3rp): 以前の状態(Stale Global State)の残留に起因するRCE''' ** '''メカニズム''': 不適切なタイミングでの致命的エラー(Fatal Error)の発生により、内部状態が直前のリクエストのメモリ領域を指したまま残り、同じワーカーが処理する後続のリクエストによって解放済みメモリが不正利用(Use-After-Free)される問題です。 == 背景と対応体制の課題 == 公式ブログでは、今回の修正に至るまでの経緯や内部的な課題についても言及されています。 * '''発見から修正までの経緯''': 2024年の外部セキュリティ監査(Quarkslabによる実施、Sovereign Tech AgencyおよびOSTIF支援)以降、OOM問題の萌芽自体は認識されていましたが、根本的な修正には「後方互換性の破壊」「新たなサービス妨害(DoS)リスク」「多数のサードパーティ製拡張機能への影響」といったトレードオフが伴い、合意形成や対応が難航していました。 * '''AI支援ツールの活用と複数機関による監査''': その後、Anthropic(Claude Mythos)、OpenAI(Daybreak Red)、Calif(Patch the Planetプログラムを通じて脆弱性を発見した研究者 Ryan A 等)、Wiz、Trail of Bitsといった複数の外部セキュリティ組織やAIツールによる解析が進み、2025年8月以降に問題の深刻さと実証コードの全貌が明確になったことで、PHP Foundationの主導のもと急ピッチで修正パッチの開発・調整が進められました。 == 修正バージョン == すべてのサポート対象ブランチに対して、以下の通りセキュリティパッチ適用済みのバージョンがリリースされています。 * '''PHP 8.2系''': <code>8.2.35</code> 以降 * '''PHP 8.3系''': <code>8.3.36</code> 以降 * '''PHP 8.4系''': <code>8.4.27</code> 以降 * '''PHP 8.5系''': <code>8.5.12</code> 以降 == 対策と管理体制の教訓 == PHPランタイムの中核(メモリ管理やエラーハンドリングなど、ほぼすべてのリクエストが通過する部分)に存在するため、アプリケーション側の対策ではなく、'''PHP本体の速やかなアップデート'''が唯一にして不可欠な根本対策となります。 また、今回のインシデントでは直前の情報リークや一部ディストリビューションによるエンバーゴ(情報公開前凍結)の早期破りなども発生しましたが、PHP Foundationやコア開発者、各ベンダーの連携により、サポート環境全体への迅速なパッチ提供が行われました。 [[Category:PHP]] qn9skwbkqwza1s1i1fuhoaezhdnbi5i