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
論語/巻第一 為政第二
0
9773
305213
303805
2026-10-30T22:00:18Z
Tomzo
248
305213
wikitext
text/x-wiki
==主要なテーマ==
:徳と礼によって自らを正し、その徳をもって人々を導く政治を説く。
==各章==
#子曰:「為政以德,譬如北辰,居其所而眾星共之。」
#:子の曰わく、政を為すに徳を以ってすれば、譬えば北辰の其の所に居て、衆星のこれに共するがごとし
#子曰:「詩三百,一言以蔽之,曰『思無邪』。」
#子曰:「道之以政,齊之以刑,民免而無恥;道之以德,齊之以禮,有恥且格。」
#[[/第四|第四]]
#:子曰:「吾十有五而志于學,三十而立,四十而不惑,五十而知天命,六十而耳順,七十而從心所欲,不踰矩。」
#::子曰く、吾十有(ゆう)五にして学に志す。 三十にして立つ。 四十にして惑わず。 五十にして天命を知る。 六十にして耳順(したが)う。 七十にして心の欲する所に従へども矩(のり)を踰(こ)えず。
#孟懿子問孝。子曰:「無違。」樊遲御,子告之曰:「孟孫問孝於我,我對曰『無違』。」樊遲曰:「何謂也?」子曰:「生事之以禮;死葬之以禮,祭之以禮。」
#孟武伯問孝。子曰:「父母唯其疾之憂。」
#子游問孝。子曰:「今之孝者,是謂能養。至於犬馬,皆能有養;不敬,何以別乎?」
#子夏問孝。子曰:「色難。有事弟子服其勞,有酒食先生饌,曾是以為孝乎?」
#子曰:「吾與回言終日,不違如愚。退而省其私,亦足以發。回也,不愚。」
#子曰:「視其所以,觀其所由,察其所安。人焉廋哉?人焉廋哉?」
#[[/第十一|第十一]]
#:子曰:「溫故而知新,可以為師矣。」
#::子曰く、「故きを温ねて新しきを知れば、もって師たるべしと。」
#子曰:「君子不器。」
#子貢問君子。子曰:「先行其言,而後從之。」
#子曰:「君子周而不比,小人比而不周。」
#[[/第十五|第十五]]
#:子曰:「學而不思則罔,思而不學則殆。」
#::子曰く、学びて思わざれば則ち罔し、思いて学ばざれば則ち殆し。
#子曰:「攻乎異端,斯害也已!」
#子曰:「由!誨女知之乎?知之為知之,不知為不知,是知也。」
#子張學干祿。子曰:「多聞闕疑,慎言其餘,則寡尤;多見闕殆,慎行其餘,則寡悔。言寡尤,行寡悔,祿在其中矣。」
#哀公問曰:「何為則民服?」孔子對曰:「舉直錯諸枉,則民服;舉枉錯諸直,則民不服。」
#季康子問:「使民敬、忠以勸,如之何?」子曰:「臨之以莊則敬,孝慈則忠,舉善而教不能,則勸。」
#或謂孔子曰:「子奚不為政?」子曰:「《書》云:『孝乎惟孝、友于兄弟,施於有政。』是亦為政,奚其為為政?」
#子曰:「人而無信,不知其可也。大車無輗,小車無軏,其何以行之哉?」
#[[/第二十三|第二十三]]
#:子張問:「十世可知也?」子曰:「殷因於夏禮,所損益,可知也;周因於殷禮,所損益,可知也;其或繼周者,雖百世可知也。」
#::子張問ふ「十世知る可きや。」
#::子曰く、「殷は夏の礼に因る、損益する所、知る可きなり。周は殷の礼に因る、損益する所、知る可きなり。其れ或いは周を継ぐ者は、百世と雖ども知る可きなり。」
#子曰:「非其鬼而祭之,諂也。見義不為,無勇也。」
{{stub|論語}}
[[Category:論語|いせい]]
53oom6hadvo2vbpdr6e5tb40dqms6am
論語/巻第一 学而第一
0
16679
305212
302402
2026-10-30T21:59:19Z
Tomzo
248
305212
wikitext
text/x-wiki
==主要なテーマ==
古典を学び、同志と交わり、他者の評価に左右されない君子を目指す。
==各章==
#[[/第一|第一]]
#:子曰、「学而時習之、不亦説乎。有朋自遠方来、不亦楽乎。人不知而不慍、不亦君子乎。」
#::子曰く、「学びて時に之を習う、亦た{{ruby|説|よろこ}}ばしからずや。朋有り遠方より来る、亦た楽しからずや。人知らずして{{ruby|慍|いか}}らず、亦た君子ならずや。」
#有子曰、「其為人也、孝悌而好犯上者鮮矣、不好犯上而好作乱者、未之有也、君子務本、本立而道生、孝悌也者、其為仁之本与。」
#子曰、「巧言令色、鮮矣仁。」
#曾子曰、「吾日三省吾身、為人謀而忠乎、与朋友交言而不信乎、伝不習乎。」
#子曰、「道千乗之国、敬事而信、節用而愛人、使民以時。」
#子曰、「弟子入則孝、出則弟、謹而信、汎愛衆而親仁、行有余力、則以学文。」
#子夏曰、「賢賢易色、事父母能竭其力、事君能致其身、与朋友交、言而有信、雖曰未学、吾必謂之学矣。」
#子曰、「君子不重則不威、学則不固、主忠信、無友不如己者、過則勿憚改。」
#曾子曰、「慎終追遠、民徳帰厚矣。」
#子禽問於子貢曰、「夫子至於是邦也、必聞其政、求之与、抑与之与」。子貢曰、「夫子温良恭倹譲以得之、夫子之求也、其諸異乎人之求之与。」
#子曰、「父在観其志、父没観其行、三年無改於父之道、可謂孝矣。」
#有子曰、「礼之用和為貴、先王之道斯為美、小大由之、有所不行、知和而和、不以礼節之、亦不可行也。」
#有子曰、「信近於義、言可復也、恭近於礼、遠恥辱也、因不失其親、亦可宗也。」
#子曰、「君子食無求飽、居無求安、敏於事而慎於言、就有道而正焉、可謂好学也已矣。」
#子貢曰、「貧而無諂、富而無驕、何如」。子曰、「可也、未若貧時楽道、富而好礼者也」。子貢曰、「詩云、如切如磋、如琢如磨、其斯之謂与」。子曰、「賜也、始可与言詩已矣、告諸往而知来者也。」
#子曰、「不患人之不己知、患己不知人也。」
{{stub|論語}}
{{DEFAULTSORT:かくし}}
[[カテゴリ:論語]]
rgt95k20v7hchv7kqs4i87eoffbgrkz
論語/巻第二 八佾第三
0
17734
305215
305190
2026-10-30T22:04:18Z
Tomzo
248
305215
wikitext
text/x-wiki
==主要なテーマ==
礼楽は社会秩序の根幹であり、身分に応じた礼を守ることが秩序を支える。
==各章==
#孔子謂季氏:「八佾舞於庭,是可忍也,孰不可忍也?」
#三家者以雍徹。子曰:「『相維辟公,天子穆穆』,奚取於三家之堂?」
#子曰:「人而不仁,如禮何?人而不仁,如樂何?」
#林放問禮之本。子曰:「大哉問!禮,與其奢也,寧儉;喪,與其易也,寧戚。」
#子曰:「夷狄之有君,不如諸夏之亡也。」
#季氏旅於泰山。子謂冉有曰:「女弗能救與?」對曰:「不能。」子曰:「嗚呼!曾謂泰山,不如林放乎?」
#子曰:「君子無所爭,必也射乎!揖讓而升,下而飲,其爭也君子。」
#子夏問曰:「『巧笑倩兮,美目盼兮,素以為絢兮。』何謂也?」子曰:「繪事後素。」曰:「禮後乎?」子曰:「起予者商也!始可與言詩已矣。」
#子曰:「夏禮,吾能言之,杞不足徵也;殷禮,吾能言之,宋不足徵也。文獻不足故也,足則吾能徵之矣。」
#子曰:「禘自既灌而往者,吾不欲觀之矣。」
#或問禘之說。子曰:「不知也。知其說者之於天下也,其如示諸斯乎!」指其掌。
#[[/第十二|第十二]]
#:祭如在,祭神如神在。子曰:「吾不與祭,如不祭。」
#::祭ること在すが如くし、神を祭ること神在すが如くす。子曰く「吾祭に與らざれば,祭らざるが如し。」
#王孫賈問曰:「與其媚於奧,寧媚於竈,何謂也?」子曰:「不然,獲罪於天,無所禱也。」
#子曰:「周監於二代,郁郁乎文哉!吾從周。」
#子入大廟,每事問。或曰:「孰謂鄹人之子知禮乎?入大廟,每事問。」子聞之曰:「是禮也。」
#子曰:「射不主皮,為力不同科,古之道也。」
#子貢欲去告朔之餼羊。子曰:「賜也,爾愛其羊,我愛其禮。」
#子曰:「事君盡禮,人以為諂也。」
#定公問:「君使臣,臣事君,如之何?」孔子對曰:「君使臣以禮,臣事君以忠。」
#子曰:「關雎,樂而不淫,哀而不傷。」
#哀公問社於宰我。宰我對曰:「夏后氏以松,殷人以柏,周人以栗,曰使民戰栗。」子聞之曰:「成事不說,遂事不諫,既往不咎。」
#子曰:「管仲之器小哉!」或曰:「管仲儉乎?」曰:「管氏有三歸,官事不攝,焉得儉?」「然則管仲知禮乎?」曰:「邦君樹塞門,管氏亦樹塞門;邦君為兩君之好,有反坫,管氏亦有反坫。管氏而知禮,孰不知禮?」
#子語魯大師樂。曰:「樂其可知也:始作,翕如也;從之,純如也,皦如也,繹如也,以成。」
#儀封人請見。曰:「君子之至於斯也,吾未嘗不得見也。」從者見之。出曰:「二三子,何患於喪乎?天下之無道也久矣,天將以夫子為木鐸。」
#子謂韶,「盡美矣,又盡善也。」謂武,「盡美矣,未盡善也」。
#子曰:「居上不寬,為禮不敬,臨喪不哀,吾何以觀之哉?」
{{stub|論語}}
{{DEFAULTSORT:はちいつ}}
[[Category:論語]]
plhmorylxdyihbkbniojd7xqi4eb8ci
論語/巻第二 八佾第三/第十二
0
48702
305214
305191
2026-10-30T22:02:57Z
Tomzo
248
/* 解説 */
305214
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:論語]]
ryoj9e7px20rl23r0cd1b9ppheahzrx
論語/巻第六 先進第十一
0
48938
305217
303948
2026-10-30T22:05:39Z
Tomzo
248
305217
wikitext
text/x-wiki
==主要なテーマ==
:弟子たちの人物と志を論じ、個性に応じた教育と仁の実践を重視する。
== 各章 ==
#[[/第一|第一]]
#:子曰:「先進於禮樂,野人也;後進於禮樂,君子也。如用之,則吾從先進。」
#::子曰く「先進の禮樂に於けるは野人なり。後進の禮樂に於けるは君子なり。如し之を用ひば、則ち吾は先進に從はん。」
#子曰:「從我於陳蔡者,皆不及門也。」
#德行:顏淵、閔子騫、冉伯牛、仲弓。言語:宰我、子貢。政事:冉有、季路。文學:子游、子夏。
#子曰:「回也,非助我者也!於吾言,無所不說。」
#子曰:「孝哉閔子騫!人不閒於其父母昆弟之言。」
#南容三復白圭,孔子以其兄之子妻之。
#季康子問:「弟子孰為好學?」孔子對曰:「有顏回者好學,不幸短命死矣!今也則亡。」
#顏淵死,顏路請子之車以為之槨。子曰:「才不才,亦各言其子也。鯉也死,有棺而無槨。吾不徒行以為之槨,以吾從大夫之後,不可徒行也。」
#顏淵死,子曰:「噫!天喪予!天喪予!」
#顏淵死,子哭之慟。從者曰:「子慟矣!」曰:「有慟乎?非夫人之為慟而誰為!」
#顏淵死,門人欲厚葬之,子曰:「不可。」門人厚葬之。子曰:「回也,視予猶父也,予不得視猶子也,非我也,夫二三子也。」
#季路問事鬼神,子曰:「未能事人,焉能事鬼!」「敢問死?」曰:「未知生,焉知死?」
#閔子侍側,誾誾如也;子路,行行如也;冉有、子貢,侃侃如也。子樂。「若由也,不得其死然!」
#魯人為長府。閔子騫曰:「仍舊貫,如之何?何必改作!」子曰:「夫人不言,言必有中。」
#子曰:「由之瑟,奚為於丘之門?」門人不敬子路。子曰:「由也升堂矣,未入於室也!」
#子貢問:「師與商也孰賢?」子曰:「師也過,商也不及。」曰:「然則師愈與?」子曰:「過猶不及。」
#季氏富於周公,而求也為之聚斂而附益之。子曰:「非吾徒也!小子鳴鼓而攻之,可也。」
#柴也愚,參也魯,師也辟,由也喭。
#子曰:「回也其庶乎,屢空。賜不受命,而貨殖焉;億則屢中。」
#子張問「善人」之道。子曰:「不踐跡,亦不入於室。」
#子曰:「論篤是與,君子者乎?色莊者乎?」
#子路問:「聞斯行諸?」子曰:「有父兄在,如之何其聞斯行之!」冉有問:「聞斯行諸?」子曰:「聞斯行之。」公西華曰:「由也問:『聞斯行諸?』子曰:『有父兄在。』求也問:『聞斯行諸?』子曰:『聞斯行之。』赤也惑,敢問。子曰:「求也退,故進之;由也兼人,故退之。」
#子畏於匡,顏淵後。子曰:「吾以女為死矣!」曰:「子在,回何敢死!」
#季子然問:「仲由冉求可謂大臣與?」子曰:「吾以子為異之問,曾由與求之問?所謂大臣者,以道事君,不可則止。今由與求也,可謂具臣矣。」曰:「然則從之者與?」子曰:「弒父與君,亦不從也。」
#子路使子羔為費宰。子曰:「賊夫人之子。」子路曰:「有民人焉,有社稷焉,何必讀書,然後為學?」子曰:「是故惡夫佞者。」
#子路、曾皙、冉有、公西華侍坐。子曰:「以吾一日長乎爾,毋吾以也。居則曰:『不吾知也。』如或知爾,則何以哉?」子路率爾而對,曰:「千乘之國,攝乎大國之間,加之以師旅,因之以饑饉,由也為之,比及三年,可使有勇,且知方也。」夫子哂之。「求,爾何如?」對曰:「方六七十,如五六十,求也為之,比及三年,可使足民;如其禮樂,以俟君子。」「赤,爾何如?」對曰:「非曰能之,願學焉!宗廟之事,如會同,端章甫,願為小相焉。」「點,爾何如?」鼓瑟希,鏗爾,舍瑟而作;對曰:「異乎三子者之撰。」子曰:「何傷乎!亦各言其志也。」曰:「莫春者,春服既成;冠者五六人,童子六七人。浴乎沂,風乎舞雩,詠而歸。」夫子喟然歎曰:「吾與點也!」三子者出,曾皙後。曾皙曰:「夫三子者之言何如?」子曰:「亦各言其志也已矣。」曰:「夫子何哂由也?」曰:「為國以禮,其言不讓,是故哂之。」「唯求則非邦也與?」安見方六七十,如五六十,而非邦也者!」「唯赤則非邦也與?」「宗廟會同,非諸侯而何?赤也為之小,孰能為之大!」
{{stub|論語}}
[[Category:論語|せんしん]]
t5eern9kwu9cc1fxoeb09nhe8bnwnrt
コンピュータセキュリティ
0
48948
305203
305201
2026-10-30T15:13:00Z
~2026-54076-02
92740
/* ランサムウェア被害からの復旧 */
305203
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 | 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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとしてあるが、セキュアブートの場合は要 MOK{{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>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.sciencedirect.com/science/article/pii/S2666281726000028 LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] ScienceDirect 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
b3l7tzixene6cbip1pa8vqts0grgbld
305205
305203
2026-10-30T15:16:52Z
~2026-54076-02
92740
/* 被害からの復旧 */
305205
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 | 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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとしてあるが、セキュアブートの場合は要 MOK{{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>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
b04nhle3f7gdb9qka9r7w6ef6cdxwue
305206
305205
2026-10-30T15:19:41Z
~2026-54076-02
92740
/* ランサムウェア被害からの復旧 */
305206
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 | 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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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=y かつ CONFIG_STRICT_DEVMEM=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>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
cgfbik0hmc86663msk8paq9vbmdiiac
305207
305206
2026-10-30T15:20:14Z
~2026-54076-02
92740
[[Special:Contributions/~2026-54076-02|~2026-54076-02]] ([[User talk:~2026-54076-02|トーク]]) による版 [[Special:Diff/305206|305206]] を取り消し
305207
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 | 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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとしてあるが、セキュアブートの場合は要 MOK{{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>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
b04nhle3f7gdb9qka9r7w6ef6cdxwue
305208
305207
2026-10-30T15:58:40Z
~2026-54076-02
92740
/* TCP/UDP経由のサービス */
305208
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとしてあるが、セキュアブートの場合は要 MOK{{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>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
5zjm15h5fx08yyb0bzh8unn6vpjs5qh
305209
305208
2026-10-30T15:59:23Z
~2026-54076-02
92740
305209
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとしてあるが、セキュアブートの場合は要 MOK{{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>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
a2cpagcwzx6ein5mquyywaw8w1gcxhm
305218
305209
2026-10-31T00:04:21Z
~2026-54076-02
92740
305218
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによる外部カーネルモジュールの導入には自己署名を用いるマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるためroot権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu では以下の外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます:
<!--* NVIDIAプロプライエタリドライバ: nvidia-dkms-* → -->
* iwlwifi: backport-iwlwifi-dkms → linux-main-modules-iwlwifi-$(uname -r)
* v4l2loopback: v4l2loopback-dkms → linux-main-modules-v4l2loopback-$(uname -r)
* vision: intel-vision-dkms → linux-main-modules-vision-$(uname -r)
* ZFS: zfs-dkms → linux-main-modules-zfs-$(uname -r)
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
dbrh0djcyrcifbewu72whfzodjb9xca
305219
305218
2026-10-31T00:14:03Z
~2026-54076-02
92740
305219
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによる外部カーネルモジュールの導入には自己署名を用いるマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるためroot権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu ではいくつか外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます。
{| class="wikitable"
|+ Ubuntuにおける DKMS 版と署名ビルド版
|-
! 外部カーネルドライバ !! DKMS版のパッケージ名 !! 署名ビルド版のパッケージ名
|-
! NVIDIAプロプライエタリドライバ
| nvidia-dkms-* || linux-modules-nvidia-*-open-$(uname -r) + linux-signatures-nvidia-$(uname -r)
|-
! iwlwifi(Intel無線LANドライバ)
| backport-iwlwifi-dkms || linux-main-modules-iwlwifi-$(uname -r)
|-
! v4l2loopback
| v4l2loopback-dkms || linux-main-modules-v4l2loopback-$(uname -r)
|-
! Intel Vision Driver
| intel-vision-dkms || linux-main-modules-vision-$(uname -r)
|-
! ZFS (Zettabyte File System)
| zfs-dkms || linux-main-modules-zfs-$(uname -r)
|}
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
s25tuuomxq2a77mexmkymzv9u3s34dr
305220
305219
2026-10-31T00:15:34Z
~2026-54076-02
92740
305220
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによる外部カーネルモジュールの導入には自己署名を用いるマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるためroot権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu ではいくつか外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます。
{| class="wikitable"
|+ Ubuntuにおける DKMS 版と署名ビルド版
|-
! 外部カーネルドライバ !! DKMS版のパッケージ名 !! 署名ビルド版のパッケージ名
|-
! NVIDIA Driver
| nvidia-dkms-* || linux-modules-nvidia-*-open-$(uname -r) 及び linux-signatures-nvidia-$(uname -r)
|-
! iwlwifi(Intel無線LANドライバ)
| backport-iwlwifi-dkms || linux-main-modules-iwlwifi-$(uname -r)
|-
! v4l2loopback
| v4l2loopback-dkms || linux-main-modules-v4l2loopback-$(uname -r)
|-
! Intel Vision Driver
| intel-vision-dkms || linux-main-modules-vision-$(uname -r)
|-
! ZFS (Zettabyte File System)
| zfs-dkms || linux-main-modules-zfs-$(uname -r)
|}
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
7zwo6xmyrbbj7ddcn5oxmq7tkpua34c
305221
305220
2026-10-31T00:18:15Z
~2026-54076-02
92740
305221
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによるソースコードからの外部カーネルモジュールの導入には自己署名のためのマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるため、root権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu ではいくつか外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます。
{| class="wikitable"
|+ Ubuntuにおける DKMS 版と署名ビルド版
|-
! 外部カーネルドライバ !! DKMS版のパッケージ名 !! 署名ビルド版のパッケージ名
|-
! NVIDIA Driver
| nvidia-dkms-* || linux-modules-nvidia-*-open-$(uname -r) 及び linux-signatures-nvidia-$(uname -r)
|-
! iwlwifi(Intel無線LANドライバ)
| backport-iwlwifi-dkms || linux-main-modules-iwlwifi-$(uname -r)
|-
! v4l2loopback
| v4l2loopback-dkms || linux-main-modules-v4l2loopback-$(uname -r)
|-
! Intel Vision Driver
| intel-vision-dkms || linux-main-modules-vision-$(uname -r)
|-
! ZFS (Zettabyte File System)
| zfs-dkms || linux-main-modules-zfs-$(uname -r)
|}
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
aatpbotg5vsh9cj3hj8vdth2aujx7v5
305222
305221
2026-10-31T00:33:49Z
~2026-54076-02
92740
305222
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによるソースコードからの外部カーネルモジュールの導入には自己署名のためのマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるため、root権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu ではいくつか外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます。
{| class="wikitable"
|+ Ubuntuにおける DKMS 版と署名ビルド版
|-
! 外部カーネルモジュール !! DKMS版のパッケージ名 !! 署名ビルド版のパッケージ名
|-
! NVIDIA Driver
| nvidia-dkms-* || linux-modules-nvidia-*-open-$(uname -r) 及び linux-signatures-nvidia-$(uname -r)
|-
! iwlwifi(Intel無線LANドライバ)
| backport-iwlwifi-dkms || linux-main-modules-iwlwifi-$(uname -r)
|-
! v4l2loopback
| v4l2loopback-dkms || linux-main-modules-v4l2loopback-$(uname -r)
|-
! Intel Vision Driver
| intel-vision-dkms || linux-main-modules-vision-$(uname -r)
|-
! Intel Integrated Image Processing Unit 6 driver
| intel-ipu6-dkms || linux-main-modules-ipu6-$(uname -r)
|-
! Intel Integrated Image Processing Unit 7 driver
| intel-ipu7-dkms || linux-main-modules-ipu7-$(uname -r)
|-
! USBIO drivers
| intel-usbio-dkms || linux-main-modules-usbio-$(uname -r)
|-
! ZFS (Zettabyte File System)
| zfs-dkms || linux-main-modules-zfs-$(uname -r)
|-
! NVIDIA DOCA-OFED
| doca-ofed-*-dkms || linux-main-modules-doca-ofed-$(uname -r)
|-
! Extensible Virtual Display Interface
| evdi-dkms || linux-main-modules-evdi-$(uname -r)
|}
しかしながら一部の外部カーネルモジュールは未だ DKMS 経由でのみ提供されている。
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は前述の MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
k1sonbgcoxd4czrbdd5a4xe856ubu8k
305223
305222
2026-10-31T00:47:22Z
~2026-54076-02
92740
305223
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによるソースコードからの外部カーネルモジュールの導入には自己署名のためのマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるため、root権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu ではいくつか外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます。
{| class="wikitable"
|+ Ubuntuにおける DKMS 版と署名ビルド版
|-
! 外部カーネルモジュール !! DKMS版のパッケージ名 !! 署名ビルド版のパッケージ名
|-
! NVIDIA Driver
| nvidia-dkms-* || linux-modules-nvidia-*-open-$(uname -r) 及び linux-signatures-nvidia-$(uname -r)
|-
! iwlwifi(Intel無線LANドライバ)
| backport-iwlwifi-dkms || linux-main-modules-iwlwifi-$(uname -r)
|-
! v4l2loopback
| v4l2loopback-dkms || linux-main-modules-v4l2loopback-$(uname -r)
|-
! Intel Vision Driver
| intel-vision-dkms || linux-main-modules-vision-$(uname -r)
|-
! Intel Integrated Image Processing Unit 6 driver
| intel-ipu6-dkms || linux-main-modules-ipu6-$(uname -r)
|-
! Intel Integrated Image Processing Unit 7 driver
| intel-ipu7-dkms || linux-main-modules-ipu7-$(uname -r)
|-
! USBIO drivers
| intel-usbio-dkms || linux-main-modules-usbio-$(uname -r)
|-
! ZFS (Zettabyte File System)
| zfs-dkms || linux-main-modules-zfs-$(uname -r)
|-
! NVIDIA DOCA-OFED
| doca-ofed-*-dkms || linux-main-modules-doca-ofed-$(uname -r)
|-
! Extensible Virtual Display Interface
| evdi-dkms || linux-main-modules-evdi-$(uname -r)
|}
しかしながら一部の外部カーネルモジュールは DKMS 経由でのみ提供されています。
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は前述の MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
sjy7nvlcuyfexjnxb5zse8n6p1ozdc4
305224
305223
2026-10-31T01:05:35Z
~2026-54076-02
92740
/* 制御フローの操作を防ぐ (CET) */
305224
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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>
一方、Linuxカーネルのシャドウスタック対応は2026年現在まだ開発中となっています (x86 Kernel Shadow Stacksパッチシリーズ)<ref>[https://www.phoronix.com/news/Linux-Kernel-Shadow-Stacks x86 Kernel Shadow Stacks Being Worked On For Linux As Powerful Control Flow Protection] Phoronix 2026年10月22日</ref>。
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによるソースコードからの外部カーネルモジュールの導入には自己署名のためのマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるため、root権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu ではいくつか外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます。
{| class="wikitable"
|+ Ubuntuにおける DKMS 版と署名ビルド版
|-
! 外部カーネルモジュール !! DKMS版のパッケージ名 !! 署名ビルド版のパッケージ名
|-
! NVIDIA Driver
| nvidia-dkms-* || linux-modules-nvidia-*-open-$(uname -r) 及び linux-signatures-nvidia-$(uname -r)
|-
! iwlwifi(Intel無線LANドライバ)
| backport-iwlwifi-dkms || linux-main-modules-iwlwifi-$(uname -r)
|-
! v4l2loopback
| v4l2loopback-dkms || linux-main-modules-v4l2loopback-$(uname -r)
|-
! Intel Vision Driver
| intel-vision-dkms || linux-main-modules-vision-$(uname -r)
|-
! Intel Integrated Image Processing Unit 6 driver
| intel-ipu6-dkms || linux-main-modules-ipu6-$(uname -r)
|-
! Intel Integrated Image Processing Unit 7 driver
| intel-ipu7-dkms || linux-main-modules-ipu7-$(uname -r)
|-
! USBIO drivers
| intel-usbio-dkms || linux-main-modules-usbio-$(uname -r)
|-
! ZFS (Zettabyte File System)
| zfs-dkms || linux-main-modules-zfs-$(uname -r)
|-
! NVIDIA DOCA-OFED
| doca-ofed-*-dkms || linux-main-modules-doca-ofed-$(uname -r)
|-
! Extensible Virtual Display Interface
| evdi-dkms || linux-main-modules-evdi-$(uname -r)
|}
しかしながら一部の外部カーネルモジュールは DKMS 経由でのみ提供されています。
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は前述の MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
hxj6kylr1by1yqzbw7s33i1ovg3iv4a
305225
305224
2026-10-31T01:06:15Z
~2026-54076-02
92740
/* 制御フローの操作を防ぐ (CET) */
305225
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 | 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>{{efn|ダブルクォーテーションで囲むと「無効な引数です」のエラーになるので注意してください。}}と記述すれば OK です。設定を直ぐに反映するには<code>sudo sysctl --system</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>
一方、Linuxカーネルのカーネル側のシャドウスタック対応は2026年現在まだ開発中となっています (x86 Kernel Shadow Stacksパッチシリーズ)<ref>[https://www.phoronix.com/news/Linux-Kernel-Shadow-Stacks x86 Kernel Shadow Stacks Being Worked On For Linux As Powerful Control Flow Protection] Phoronix 2026年10月22日</ref>。
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<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 /verifyonly</code> || <code>sfc /scannow</code>
|-
| Debパッケージ (Debian / Ubuntu) || <code>debsums -s</code> || <code>apt install --reinstall $(debsums -cs | xargs -r dpkg-query -S | cut -d: -f1 | 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'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>
なおセキュアブートの環境において DKMS (Dynamic Kernel Module Support) などによるソースコードからの外部カーネルモジュールの導入には自己署名のためのマシン所有者キー (Machine-Owner Key; MOK) が使われていますが、標準ではその秘密鍵がrootからアクセスできる領域に置かれるため、root権限があればどんな悪意のあるカーネルモジュールにも署名を付けることが可能となってしまいます<ref name="ubuntu-secure-boot"/>。そのため MOK はなるべく使わないようにしましょう。
Ubuntu ではいくつか外部カーネルモジュールに DKMS 版ではなく署名ビルド版を使用することができます。
{| class="wikitable"
|+ Ubuntuにおける DKMS 版と署名ビルド版
|-
! 外部カーネルモジュール !! DKMS版のパッケージ名 !! 署名ビルド版のパッケージ名
|-
! NVIDIA Driver
| nvidia-dkms-* || linux-modules-nvidia-*-open-$(uname -r) 及び linux-signatures-nvidia-$(uname -r)
|-
! iwlwifi(Intel無線LANドライバ)
| backport-iwlwifi-dkms || linux-main-modules-iwlwifi-$(uname -r)
|-
! v4l2loopback
| v4l2loopback-dkms || linux-main-modules-v4l2loopback-$(uname -r)
|-
! Intel Vision Driver
| intel-vision-dkms || linux-main-modules-vision-$(uname -r)
|-
! Intel Integrated Image Processing Unit 6 driver
| intel-ipu6-dkms || linux-main-modules-ipu6-$(uname -r)
|-
! Intel Integrated Image Processing Unit 7 driver
| intel-ipu7-dkms || linux-main-modules-ipu7-$(uname -r)
|-
! USBIO drivers
| intel-usbio-dkms || linux-main-modules-usbio-$(uname -r)
|-
! ZFS (Zettabyte File System)
| zfs-dkms || linux-main-modules-zfs-$(uname -r)
|-
! NVIDIA DOCA-OFED
| doca-ofed-*-dkms || linux-main-modules-doca-ofed-$(uname -r)
|-
! Extensible Virtual Display Interface
| evdi-dkms || linux-main-modules-evdi-$(uname -r)
|}
しかしながら一部の外部カーネルモジュールは DKMS 経由でのみ提供されています。
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(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=y かつ CONFIG_STRICT_DEVMEM=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 パッケージとして用意されているが、セキュアブートの場合は前述の MOK による自己署名が必要なので非推奨{{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 name="ubuntu-secure-boot">[https://documentation.ubuntu.com/security/security-features/platform-protections/secure-boot/ UEFI Secure Boot - Ubuntu security documentation] Canonical</ref>)という大きな欠点も存在します。}})
* eBPF プログラムによるメモリダンプ(モダンなシステムで推奨<ref>Andrea Oliveri et al. [https://www.s3.eurecom.fr/docs/dfrwseu26_oliveri.pdf LEMON: A universal eBPF-based volatile memory acquisition tool for modern android devices and hardened linux systems] Eurecom 2026年3月</ref>){{efn|ただしeBPFが有効のカーネルに限る。}}
** LEMON[https://github.com/eurecom-s3/lemon]
<!--TODO: 未検証
** emd[https://github.com/ph0llux/emd] - 未検証
-->
最後にクリーンな環境を使ってダンプしたメモリから暗号化に使われた鍵を見つけましょう。これには例えば以下のようなプログラムが存在します。
* C3RB3R向け: https://github.com/soimy/c3rb3r-rescue
なおこの方法はファイル暗号化の部分に共通鍵を使うランサムウェアにのみ効果があります。非対称鍵を直接ファイル暗号化に使うランサムウェアには無効なので期待しすぎないようにしましょう。
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
d188hie2z8rsnjszbda5owp6hm448d6
論語/巻第三 雍也第六
0
48972
305216
305169
2026-10-30T22:05:09Z
Tomzo
248
305216
wikitext
text/x-wiki
==主要なテーマ==
:仁を中心に、学問・徳・知恵を兼ね備えた君子のあり方を説く。
== 各章 ==
#子曰:「雍也、可使南面。」仲弓問子桑伯子。子曰:「可也、簡。」仲弓曰:「居敬而行簡、以臨其民、不亦可乎。居簡而行簡、無乃大簡乎。」子曰:「雍之言然。」
#哀公問:「弟子孰為好學。」孔子對曰:「有顏回者、好學;不遷怒、不貳過、不幸短命死矣。今也則亡、未聞好學者也。」
#子華使於齊、冉子為其母請粟。子曰:「與之釜。」請益、曰:「與之庾。」冉子與之粟五秉。子曰:「赤之適齊也、乘肥馬、衣輕裘;吾聞之也:君子周急不繼富。」原思為之宰、與之粟九百、辭。子曰:「毋。以與爾鄰里鄉黨乎。」
#子謂仲弓曰:「犁牛之子、騂且角;雖欲勿用、山川其舍諸。」
#子曰:「回也、其心三月不違仁。其餘、則日月至焉而已矣。」
#季康子問:「仲由可使從政也與。」子曰:「由也果、於從政乎何有。」曰:「賜也可使從政也與。」曰:「賜也達、於從政乎何有。」曰:「求也可使從政也與。」曰:「求也藝、於從政乎何有。」
#季氏使閔子騫為費宰。閔子騫曰:「善為我辭焉。如有復我者、則吾必在汶上矣。」
#伯牛有疾、子問之、自牖執其手、曰:「亡之、命矣夫。斯人也、而有斯疾也。斯人也、而有斯疾也。」
#子曰:「賢哉回也。一簞食、一瓢飮、在陋巷、人不堪其憂、回也不改其樂。賢哉回也。」
#冉求曰:「非不說子之道、力不足也。」子曰:「力不足者、中道而廢;今女畫。」
#子謂子夏曰:「女為君子儒、無為小人儒。」
#子游為武城宰。子曰:「女得人焉耳乎。」曰:「有澹臺滅明者、行不由徑;非公事、未嘗至於偃之室也。」
#子曰:「孟之反不伐、奔而殿、將入門、策其馬、曰:『非敢後也、馬不進也。』」
#子曰:「不有祝鮀之佞、而有宋朝之美、難乎免於今之世矣。」
#子曰:「誰能出不由戶。何莫由斯道也。」
#[[/第十六|第十六]]
#:子曰:「質勝文則野、文勝質則史。文質彬彬、然後君子。」
#::子曰く、質の文に勝れるは、則ち野なり。文の質に勝れるは、則ち史なり。文質彬彬として、然る後に君子たり。
#子曰:「人之生也直、罔之生也幸而免。」
#子曰:「知之者、不如好之者、好之者、不如樂之者。」
#子曰:「中人以上、可以語上也;中人以下、不可以語上也。」
#樊遲問知。子曰:「務民之義、敬鬼神而遠之、可謂知矣。」問仁。曰:「仁者先難而後獲、可謂仁矣。」
#子曰:「知者樂水、仁者樂山。知者動、仁者靜。知者樂、仁者壽。」
#子曰:「齊一變、至於魯;魯一變、至於道。」
#子曰:「觚不觚、觚哉。觚哉。」
#宰我問曰:「仁者雖吿之曰:『井有仁焉。』其從之也。」子曰:「何為其然也。君子可逝[1]也、不可陷也。可欺也、不可罔也。」
#子曰:「君子博學於文、約之以禮、亦可以弗畔矣夫。」
#子見南子、子路不說。夫子矢之曰:「予所否者、天厭之。天厭之。」
#子曰:「中庸之為德也、其至矣乎。民鮮久矣。」
#子貢曰:「如有博施於民、而能濟眾、何如。可謂仁乎。」子曰:「何事於仁、必也聖乎。堯舜其猶病諸。夫仁者、己欲立而立人、己欲達而達人。能近取譬、可謂仁之方也已。」
{{stub|論語}}
[[Category:論語|ようや]]
rdkgjp9jp4i0omwx7b786wd93tr5dgy
満洲語/レッスン2 - 名詞
0
48975
305204
2026-10-30T15:14:50Z
ななしのごんべー
92907
タスハハルチガイ氏による2025年9月24日(水曜日) 03:20のhttps://zh.wikibooks.org/w/index.php?title=%E6%BB%A1%E8%AF%AD/%E7%AC%AC2%E8%8A%82%E8%AF%BE_-_%E5%90%8D%E8%AF%8D&diff=prev&oldid=182175を翻訳して新規作成した
305204
wikitext
text/x-wiki
==会話と翻訳文==
{|
|-
|.........................................................................................................................
|.........................................................................................................................
|-
|ere haha oci mini ama.
|この男の人は私の父です。
|-
|tere hehe oci mini eme.
|あの女の人は私の母です。
|-
|mini eme oci manju niyalma.
|私の母は満州人です。
|-
|ere oci we i bithe?.
|これは誰の本ですか?
|-
|ere oci mini eme i bithe.
|これは私の母の本です。
|-
|sikse mini ama Cicigar de genehe. Cicigar de manjusa labdu.
|昨日私の父がチチハルへ行きました。 チチハルには満州人が多いです。
|-
|mini ama Cicigar de ere manju gisun be tacire bithe be udaha.
|私の父はチチハルでこの満州語学習の本を買いました。
|-
|i ere bithe be mini eme de buhe.
|彼はその本を母へあげました。
|-
|te mini eme inenggidari manju gisun be tacimbi.
|今私の母は毎日満州語を勉強しています。
|-
|mini eme hendume: "nikan gisun ci manju gisun ja".
|私の母は「満州語は中国語よりも簡単」と言っています。
|-
|.........................................................................................................................
|.........................................................................................................................
|-
|}
==語彙==
{|
|-
|............................................................
|............................................................
|............................................................
|............................................................
|-
|'''満州語'''
|'''日本語'''
|'''満州語'''
|'''日本語'''
|-
|akū
|〜ではない、〜がない
|ama
|父
|-
|arara
|書くだろう(未来形)
|be
|〜を (対格)
|-
|bi
|ある
|bithe
|本、書物、図書、書信、書物
|-
|buha
|あげた (過去形)
|ci
|〜から (奪格)
|-
|dari
|毎〜
|de
|〜で/〜に、〜へ (与位格/与格)
|-
|eme
|母
|emu
|一、一つの
|-
|ere
|これ、この
|genehe
|行った(過去形)
|-
|gisun
|言葉、言語、話
|gurun
|国家、部族、人々
|-
|haha
|男、男性、男らしい男
|hairambi
|愛する、大切に扱う
|-
|halukan
|温かい、温もりのある
|hehe
|妻、女
|-
|hendume
|言う
|i
|彼、彼女
|-
|i
|〜の (属格)
|ilha
|花
|-
|inenggi
|日、〜日、昼
|inenggidari
|毎日
|-
|isinaha
|到着した、届いた、着いた、到達した (過去形)
|ja
|安い、易しい、簡単だ
|-
|komso
|少ない
|labdu
|多い、大いに
|-
|mafa
|祖父、おじいちゃん
|manju
|満州族
|-
|manjusa
|満州族 (複数)
|mini
|私の (属格)
|-
|nikan
|漢民族
|niyalma
|人
|-
|niyengniyeri
|春
|oci
|〜である (英語のbe動詞に相当)
|-
|oho
|もうよい、〜になった (過去形)
|sa
|〜たち (複数接尾辞)
|-
|sikse
|昨日
|tacire
|勉強するだろう(未来形)
|-
|te
|今
|te
|今
|-
|tere
|あれ、あの
|tubade
|あそこで (与格 与位格、)
|-
|udaha
|買った (過去形)
|we
|誰
|-
|............................................................
|............................................................
|............................................................
|............................................................
|-
|}
==文法==
===名詞===
満州語には数と格がありますが、本当の意味での性はないです。満州語の名詞は語幹によって構成されることがあり、例として「bithe(本)」が挙げられます。また、語幹に接尾辞をつけて新しい名詞を構成することもあります。さらに、2つの名詞を連結させることも可能で、例えば「ahūn(兄)」と「deo(弟)」を連結して「ahūn deo(兄弟)」という単語を構成します。名詞の語幹と結合して名詞を構成する接尾辞には、以下のようなものがあります:
{|
|-
|............................................................................
|....................................................................
|....................................................................
|-
|'''動詞の語幹に接続する接尾辞'''
|'''例'''
|'''互換'''
|-
| -n
|taci'''n''' – 勉強
|動詞'''taci'''mbi(勉強する)
|-
| -gan, -gen, -gon, -han, -hen, -hon
|niru'''gan''' – 絵
|動詞'''niru'''mbi (描く)
|-
| -ku, -kū
|ana'''kū''' - 鍵
|動詞'''ana'''mbi (押す)
|-
| -cun
|buye'''cun''' - 愛
|動詞'''buye'''mbi (愛する)
|-
|'''名詞と動詞の語幹に接続する接尾辞'''
|'''例'''
|'''由来'''
|-
| -si
|usi'''si''' – 農家
|名詞usin (田んぼ、畑)
|-
| -ci
|adu'''ci''' - 牧人
|名詞adun (家畜)
|-
| -ji, -lji, -mji, -nju
|boigo'''ji''' – 主人
|名词boigon (家族)
|-
|............................................................................
|....................................................................
|....................................................................
|-
|}
注意:接尾辞-ku, -kūは道具を表すことが多く、-cunは抽象的な概念を表すことが多くて、-si、-ci、-jiは関連する事柄に従事する人を表すことが多いです。名詞に接尾辞を加えるとき、その名詞が“n”で終わる場合、通常そのnは省略する。
====名詞の性====
名詞はヨーロッパの言語とは違って性はありません。しかしいくつかの男性名詞には男性母音を含み、女性名詞には女性母音を含みます。例: haha (男)、hehe (女)、ama (父親)、eme (母親)。
====名詞の数====
満州語には複数を表す方法が多くあります:
<u>接尾辞 -sa (-se, -so, -si)を伴うもの</u>
* 例: manju'''sa''' - 満州族の人'''たち'''
<u>接尾辞 -ta, -te, -riを伴うもの.</u>
* 主に親戚関係を表す名詞に用いられます(末尾の'n'は通常は省略).
* 例: amji''ta'' -伯父'''たち'''
<u>形容詞を伴うもの</u>
* 例如:geren (多い), eiten (すべての), tumen (1万の) 、または修辞的表現gemu (すべての)
* 例如: tumen jaka - (万物)
====名詞の格====
満州語には5つの格があります。格は接尾辞の形、あるいは接尾辞を伴わない状態で他の言葉との文法関係を表現します:
<u>主格 (接尾辞なし).</u>
* 接尾辞はない
* 例: bithe (本)
<u>属格/具格(-i, 但し-ngの後ろは-ni).</u>
* 所有・所属関係を表す格です。 接尾辞-i (-ni)は具格として用いて、因果関係や手段を表すこともできます。
* 例: ere oci mini eme '''i''' bithe - これは 私の 母'''の''' 本です(''所有関係'')
* 例: mafa gurun '''i''' ilha - 祖国'''の'''花 (''所属関係'')
* 例如: manju gisun '''i''' arambi - 満州語'''で''' 本を書く(満州語を使って本を書く,''手段'')
<u>与位格/与格 (-de).</u>
*位置や方向を表す格です(〜に、〜へ、〜で)。
* 例: 方向: Cicikar '''de''' genehe - チチハル'''へ''' 行った (''方向'')
* 例如: 位置: Cicikar '''de''' manjusa labdu - チチハル'''では''' 満州族は 多いです (''位置'')
* 例: Beging '''de''' niyengniyeri isinaha - 北京'''に''' 春が 来た。
<u>対格 (-be).</u>
* 動作の受け身関係を表す格です。
* 例: i ere bithe '''be''' mini eme de buha - 彼は この 本'''を''' 私の お母さん へ あげました。
* 例: te mini eme inenggidari manju gisun '''be''' tacimbi - 今 私の お母さんは 毎日 満州語'''を''' 勉強しています。
* 例: be mafa gurun '''be''' hairambi. 私たちは 祖国'''を''' 愛しています。
<u>奪格/比格 (-ci).</u>
* 物事の起点や比較を表す格です。
* 例:monggo gurun '''ci''' jihe niyalma - モンゴル国'''から''' 来た 人。(''起点'')
* 例: nikan gisun '''ci''' manju gisun ja - 中国語'''よりも''' 満州語は 簡単です。(''比較'')
* 例: emu inenggi '''ci''' emu inenggi halukan oho - 一日'''よりも''' 一日は 熱いです。(''比較'')(一日ごとに暑さが増した。)
<!-- Navigation -->
<p style="background: #f2f2f2; border: 1px dashed #e6e6e6; padding-left: 3px; width: 100%; text-align: center;">
[[満洲語/レッスン1 - 発音]] ---- [[満洲語|メインページに戻る]] ---- [[満洲語/レッスン3 - 代名詞]]
</p>
<!-- END Navigation -->
[[Category:満洲語]]
rj6ep7wn07obk0xtgs4ca1y99qg6896
満洲語/レッスン3 - 代名詞
0
48976
305210
2026-10-30T18:23:32Z
ななしのごんべー
92907
2025年9月24日 (水曜日) 00:39のタスハハルチガイ氏による編集後のhttps://zh.wikibooks.org/w/index.php?title=%E6%BB%A1%E8%AF%AD/%E7%AC%AC3%E8%8A%82%E8%AF%BE_-_%E4%BB%A3%E8%AF%8D&diff=prev&oldid=182179を翻訳して新規作成
305210
wikitext
text/x-wiki
==会話と翻訳文==
{|
|-
|Baturu............: {{ruby|si|あなたは(主格)}} {{ruby|saiyūn|いいですか}}?
|Baturu............: お元気ですか?
|-
|Zhang Min......: {{ruby|bi|私は(主格)}} {{ruby|umesi|とても}} {{ruby|sain|良い}}. {{ruby|Sini|あなたの(属格)}} {{ruby|beye dursun|体は}} sain {{ruby|nio|疑問助詞}}?
|Zhang Min......: 私は元気です、あなたの体調はいかがですか?
|-
|Baturu............: umesi sain, {{ruby|baniha|ありがとう}}.
|Baturu............: とても良いです、ありがとう。
|-
|Zhang Min......: {{ruby|gucu|友達}}, si {{ruby| oci |は(奪格)}} {{ruby|manju|満州}} {{ruby|niyalma|人}} {{ruby|inuo|ですか}}?
|Zhang Min......: 友よ、あなたは満州族ですか?
|-
|Baturu............: {{ruby|inu|はい}}, bi oci manju niyalma. Sini {{ruby|aiman|民族(主格)}} {{ruby|ai|何}}?
|Baturu............: はい、私は満州族です。あなたはなんの民族ですか?
|-
|Zhang Min......: bi oci {{ruby|nikan|漢民族}} niyalma, {{ruby|damu|しかし(接続詞)}} {{ruby|mini|私の(属格)}} {{ruby|sargan|妻は(主格)}} oci {{ruby|monggo|モンゴル}} niyalma. {{ruby|Sinde|あなたに(与位格)}} sargan {{ruby|bio|存在+疑問助詞}}?
|Zhang Min......: 私は漢民族ですが、妻はモンゴル族です。あなたに妻はいますか?
|-
|Baturu............: {{ruby|minde|私に(与位格)}} sargan {{ruby|akū|ない}}. sini {{ruby|sargan|(主格)}} ai {{ruby|gebu|名前}} ai {{ruby|hala|名字}}?
|Baturu............: いないです。あなたの妻の名前と名字はなんですか?
|-
|Zhang Min......: mini sargan {{ruby|gebu|(主格)}} Bing Bing, {{ruby|hala|(主格)}} Wang inu. si {{ruby|imbe|彼女に(与位格)}} {{ruby|takambio|知っている+疑問助詞}}?
|Zhang Min......: 私の妻の名字は王(ワン)で、名前は氷氷(ビンビン)です。彼女を知っているのですか?
|-
|Baturu............: {{ruby|takarakū|知っている+否定}}. bi {{ruby|ubade|ここに(与位格)}} {{ruby|juwe|2}} {{ruby|biya|月}} {{ruby|oho|なった(過去形)}}, {{ruby|kemuni|まだ}} {{ruby|tokso|村}} i {{ruby|labdu|多い}} niyalma {{ruby|be|(対格)}} takarakū.
|Baturu............: 存じません。私はここに来て二ヶ月になります。村にはまだ知らない人が多くいます。
|-
|Zhang Min......: si {{ruby|tokso|村}} de {{ruby|minci|私から(奪格)}} {{ruby|tulgiyen|以外で}} {{ruby|we|誰}} be takambi?
|Zhang Min......: 村では私を除いて誰と面識がありますか?
|-
|Baturu............: bi {{ruby|Siyoo Jang|張さん(音訳)}} {{ruby|jai|と}} {{ruby|Siyoo Wang|王さん(音訳)}} be takambi.
|Baturu............: 張さんと王さんとは面識があります。
|-
|Zhang Min......: si ai {{ruby|erin|時}} de Siyoo Wang be {{ruby|takaha|面識を持った(過去形)}}?
|Zhang Min......: あなたはいつ王さんと面識を持ったのですか?
|-
|Baturu............: bi {{ruby|cembe|彼らを(対格)}} {{ruby|emu|一}} biya {{ruby|onggolo|前}} takaha.
|Baturu............: 一ヶ月前に面識を持ちました。
|-
|Zhang Min......: aibade?
|Zhang Min......: どこで?
|-
|Baturu............: Siyoo Jang {{ruby|ni|属格}} {{ruby|boode|家で(与位格)}}.
|Baturu............: 張さんの家で。
|-
|Zhang Min......: {{ruby|tuttu|そのように}} oci si Siyoo Jang ni boo de {{ruby|genehe|行った(過去形)}}.
|Zhang Min......: それならあなたは張さんの家に行ったんですね。
|-
|Baturu............: genehe. bi {{ruby|te|今}} {{ruby|šolo|暇}} akū, bi {{ruby|neneme|先んずる-me}} genembi.
|Baturu............: 行きました。私はいま暇がありません、先に行きます。
|-
|Zhang Min......: sain, {{ruby|sirame|続ける-me}} {{ruby|acaki|会う-ki}}
|Zhang Min......: わかりました、また会いましょう。
|-
|..............................................................................................................................................
|..............................................................................................................................................
|-
|}
==語彙==
{|
|-
|............................................................
|............................................................
|............................................................
|............................................................
|-
|'''満州語'''
|'''日本語'''
|'''満州語'''
|'''日本語'''
|-
|ai
|何
|aibade
|どこで
|-
|aiman
|部落、民族
|baniha
|ありがとう
|-
|beye dursun
|体
|biya
|月(地球の衛星)、ヶ月月
|-
|boo
|家、部屋、建物
|cembe
|彼らを/彼女たちを (対格)
|-
|damu
|しかし
|emu
|一、一つの
|-
|erin
|時間、時、時刻
|gebu
|名前、名称、名義、招牌
|-
|genehe
|行った(過去形)
|genembi
|行く、赴く
|-
|gucu
|友達、友人
|hala
|名字
|-
|imbe
|彼を/彼女を (対格)
|inu
|〜も
|-
|jai
|第二の、次の、また、再び、〜と
|juwe
|二、2つの
|-
|kemuni
|まだ
|minci
|私から (奪格)
|-
|minde
|私で/私に (与位格)
|monggo
|モンゴル
|-
|neneme
|先に
| -o
|か?
|-
|oho
|もうよい、〜になった (過去形)
|ombi
|〜できる、〜してよい(可能・許可)、〜になる
|-
|onggolo
|〜の前に、以前に
|sain
|良い、美しい、立派な、善良な
|-
|sargan
|妻
|si
|あなた
|-
|sinde
|あなたで/あなたに (与位格)
|sini
|あなたの (属格)
|-
|sirame acaki
|さようなら
|takambi
|知る、認識する、見分ける、理解する
|-
|takarakū
|知らない、認識しない
|tokso
|村、集落、村落
|-
|tulgiyen
|〜以外、他に
|tuttu oci
|そうであるならば、そうであるからには
|-
|ubade
|ここで、ここに
|umesi
|非常に、とても
|-
|we
|誰
|šolo
|暇、休暇
|-
|............................................................
|............................................................
|............................................................
|............................................................
|-
|}
==文法==
===代名詞===
====人称代名詞====
名詞と同様に、満洲語の人称代名詞にも格による違いがあります。一般的に、満洲語の人称代名詞は主格を使用します。下表は、満洲語の人称代名詞の5つの格を表したものです:
{|
|.....................................................
|.................................
|.................................
|.................................
|.................................
|.................................
|-
|'''人称代名詞'''
|'''主格 '''
|'''属格 '''
|'''与位格/与格 '''
|'''対格 '''
|'''奪格 '''
|-
|''単数''
|
|
|
|
|
|-
|'''一人称'''
|bi
|mini
|minde
|mimbe
|minci
|-
|'''二人称'''
|si
|sini
|sinde
|simbe
|sinci
|-
|'''三人称'''
|i
|ini
|inde
|imbe
|inci
|-
|''複数''
|
|
|
|
|
|-
|'''一人称(包括形-聞き手を含む)'''
|muse
|musei
|musede
|musebe
|museci
|-
|'''一人称(除外形-聞き手を含めない)'''
|be
|meni
|mende
|membe
|menci
|-
|'''二人称'''
|suwe
|suweni
|suwende
|suwembe
|suwenci
|-
|'''三人称'''
|ce
|ceni
|cende
|cembe
|cenci
|-
|.....................................................
|.................................
|.................................
|.................................
|.................................
|.................................
|-
|}
*人称代名詞の主格形は基本形です、例えばbi = 私,si = あなた,i = 彼/彼女/それ,be = 私たち(相手を含めない), muse = 私たち(相手を含む), suwe = あなた達, ce = 彼ら/彼女ら/それら。
* 一人称代名詞「私」には格によって異なる語形があります:主格 bi=私は;属格 mini=私の;与位格 minde=私のいる場所で/私に;対格 mimbe=私を;奪格 minci=私から。他の人称代名詞もこれに準じます。
* 満州語には一人称複数を表すのに二パターンがあります:相手を含まない“be”と相手を含む“muse”。
* 「〜自身」と表現するには、満州語では属格人称代名詞を用いて、「beye(体)」を加えます。例: mini beye (私自身), sini beye (あなた自身)。
* 「〜のもの」という表現は、属格人称代名詞の末尾に“-ngge”を加えることでできる。例えば:mini-ngge (私のもの)。Ere bithe miningge (この本は私のものです)。
以下は人称代名詞のそれぞれの格での例です:
;主格
* '''bi''' manju gisun be tacimbi - '''私は'''満州語を 勉強します
* '''i''' oci manju niyalma - '''彼は'''満州族です
;属格
* '''mini''' gucu oci manju niyalma - '''私の'''友達は 満州族です
* '''meni''' eme oci mafa gurun - '''私たちの'''母は 祖国です
;与位格
* '''sinde''' ai baita bi? - '''あなたに'''何の 用事が あるか?
* tere emu debtelin bithe be '''minde''' buki - その 一冊の 本を'''私に''' 下さい
;対格
* mafa gurun '''membe''' ujime hūwašabuha - 祖国が'''我たちを''' 育てた
* bi '''cembe''' emu biya onggolo takaha - 私は'''彼を''' 一ヶ月前に 知りました。
;奪格
* i '''minci''' juwe se ajige - 彼は'''私より'''2歳 若い
* si '''minci''' tulgiyen we be takambi? - あなたは'''私'''以外に誰と面識がありますか?
====指示代名詞====
満州語の指示代名詞には以下のようなものがあります:
{|
|............................................
|.................................
|.................................
|.................................
|.................................
|-
|'''格'''
|'''これ'''
|'''これら'''
|'''あれ'''
|'''あれら'''
|-
|'''主格 '''
|ere
|ese
|tere
|tese
|-
|'''属格 '''
|erei (ereni)
|esei
|terei
|tesei
|-
|'''与位格 '''
|erede (ede)
|esede
|terede (tede)
|tesede
|-
|'''対格 '''
|erebe
|esebe
|terebe
|tesebe
|-
|'''奪格 '''
|ereci
|eseci
|tereci
|teseci
|-
|............................................
|.................................
|.................................
|.................................
|.................................
|-
|}
====疑問代名詞====
満州語の主要な疑問代名詞には以下のようなものがあります(格の違いに注意):
{|
|.................................
|.................................
|.................................
|.................................
|-
|'''満州語'''
|'''日本語'''
|'''満州語'''
|'''日本語'''
|-
|we
|誰
|aibide, yabade
|どこで、どこへ
|-
|ai
|何
|adarame
|どのように
|-
|ya
|何、誰
|aici
|どのような、どんな
|-
|ainu
|なぜ
|udu
|いくら、いくつ
|-
|aibi
|どこ
|aba
|どこ
|-
|.................................
|.................................
|.................................
|.................................
|-
|}
<!-- Navigation -->
<p style="background: #f2f2f2; border: 1px dashed #e6e6e6; padding-left: 3px; width: 100%; text-align: center;">
[[満洲語/レッスン2 - 名詞]] ---- [[満洲語|メインページに戻る]] ---- [[満洲語/レッスン4 - 数詞]]</p><!-- END Navigation -->
[[Category:满语]]
a0r5ug3l63267sklnpp9lx8i24otu4m
満洲語/レッスン4 - 数詞
0
48977
305211
2026-10-30T19:05:24Z
ななしのごんべー
92907
2025年9月24日 (水曜日) 04:51のタスハハルチガイ氏による編集後のhttps://zh.wikibooks.org/w/index.php?title=%E6%BB%A1%E8%AF%AD/%E7%AC%AC4%E8%8A%82%E8%AF%BE_-_%E6%95%B0%E8%AF%8D&diff=prev&oldid=182181を翻訳して新規作成した
305211
wikitext
text/x-wiki
==会話と翻訳文==
{|
|'''会話 1'''
|'''会話 1'''
|-
|be oci mafa gurun i ilha
|私たちは祖国の花です
|-
|ajige orho i eme oci amba na,
|小さな草の母は大地で、
|-
|ajige nimaha i eme oci amba mederi,
|小魚の母は大海で、
|-
|usiha i eme oci abka i untuhun,
|星々の母は空で、
|-
|meni eme oci mafa gurun---dulimbai gurun.
|私たちの母は私たちの祖国---中国です。
|-
|be oci mafa gurun i ilha,
|私たちは祖国の花で、
|-
|fuldun fuldun ilha mafa gurun be miyamimbi,
|たくさんの花々が祖国を美しく飾り、
|-
|mafa gurun membe ujime hūwašabuha,
|祖国は私たちを育んでくれた、
|-
|be mafa gurun be hairambi.
|私たちは祖国を深く愛する。
|-
|..............................................................................................................................................
|..............................................................................................................................................
|-
|'''会話 2'''
|'''会話 2'''
|-
|A) gucu te udu erin oho?
|A) 友よ、今は何時になりましたか?
|-
|B) juwan erin oho.
|B) 10時になりました。
|-
|A) baniha. si oci Siyoo Wang i tacin gucu inuo?
|A) ありがとう。あなたは王さんのクラスメートですか?
|-
|B) inu. bi Siyoo Wang ni emgi emu minggan uyun tanggū nadanju sunjaci aniya oros gisun be taciha
|B) はい。私は1975年に王さんと一緒にロシア語を学んだことがあります。
|-
|A) si ya tacikū de oros gisun be taciha?
|A) あなたはどの大学でロシア語を学んだのですか?
|-
|B) Cing Hūwa amba tacikū de
|B) 清華大学でです。
|-
|A) si ere aniya udu se oho?
|A) あなたは今年何歳ですか?
|-
|B) bi susai juwe se oho.
|B) 私は52歳になりました。
|-
|..............................................................................................................................................
|..............................................................................................................................................
|-
|'''会話 3'''
|'''会話 3'''
|-
|A) sinde udu indahūn bio?
|A) あなたには何匹の犬がいますか?
|-
|B) uheri tofohon indahūn bi. tofohon i ilan ubu i emu ubu boode bi
|B) 合計で15匹います。15匹の⅓は家にいます
|-
|A) tuttu oci boode udu indahūn bio?
|A) それなら、家に犬は何匹いますか?
|-
|B) boode sunja indahūn bi.
|B) 家には5匹の犬がいます。
|-
|}
==語彙==
{|
|-
|............................................................
|............................................................
|............................................................
|............................................................
|-
|'''満州語'''
|'''日本語'''
|'''満州語'''
|'''汉日本語'''
|-
|abka
|天、天空、天気、神
|abka i untuhun
|天空
|-
|ajige
|小さい、幼い、微小な
|amba
|大きい
|-
|amba tacikū
|大学
|aniya
|年、歳、年代、正月
|-
|be
|私たち
|emgi
|一緒に
|-
|erin
|時、時間、時刻、〜の頃
|fuldun
|花
|-
|gurun
|国家、部族、(一群の)人々
|hairambi
|愛する、大切に扱う
|-
|hūwašabumbi
|教育、育成、養育
|ilha
|花
|-
|indahūn
|狗、戌
|dulimbai gurun
|中国
|-
|mafa
|祖父、祖先
|mafa gurun
|祖国
|-
|mederi
|海
|miyamimbi
|化粧する、着飾る、装う、飾る、繕う
|-
|na
|地、土地
|nimaha
|魚
|-
|orho
|草
|oros
|ロシア
|-
|se
|年齢
|tacikū
|学校
|-
|tacin gucu
|クラスメイト
|tuttu oci
|もしそうならば、そうであるからには
|-
|ubu
|部分、分け前、割り当て、倍、縁
|udu
|いくつか、いくらか
|-
|uheri
|合計、全部、すべて
|ujimbi
|養う、育てる、休養する、出産する
|-
|untuhun
|空、空虚、空間、宇宙
|usiha
|星
|-
|ya
| どの、何
|-
|}
==文法==
===数詞===
====基数詞====
満州語の奇数支配下の通りである:
{|
|-
|......................................
|......................................
|......................................
|......................................
|-
|emu (emke)
|1
|juwan jakūn
|18
|-
|juwe
|2
|juwan uyun
|19
|-
|ilan
|3
|orin
|20
|-
|duin
|4
|orin emu
|21
|-
|sunja
|5
|gūsin
|30
|-
|ninggun
|6
|dehi
|40
|-
|nadan
|7
|susai
|50
|-
|jakūn
|8
|ninju
|60
|-
|uyun
|9
|nadanju
|70
|-
|juwan
|10
|jakūnju
|80
|-
|juwan emu
|11
|uyunju
|90
|-
|juwan juwe
|12
|tanggū
|100
|-
|juwan ilan
|13
|juwe tanggū susai emu
|251
|-
|juwan duin
|14
|minggan
|1,000
|-
|tofohon
|15
|tumen
|10,000
|-
|juwan ninggun
|16
|juwan tumen
|100,000
|-
|juwan nadan
|17
|tanggū tumen
|1,000,000
|-
|......................................
|......................................
|......................................
|......................................
|-
|}
注意:15を表す言い方は不規則です。
====助数詞====
満州語の助数詞は基数詞の語末に-ciを加えることによってできます。基数詞が“n”で終わる場合は、“n”を取り除いてから-ciを加えます。しかし、juwan、nadan、tumenは例外で、nは残します。
* emuci/ujui (第1の)
* juwe tanggv susai emuci (第251の)
* ningguci (第6の)
* minggaci (第1000の)
* juwanci (第10の)
* tumenci (第10000の)
* juwan duici (第14の)
====分配数詞====
分配数詞は“何個かのうち1個”を表し、基数詞の語末に-ta/-te/toを加えることによってでき、母音調和の規則に従います。
* ilata (3個のうち1個、3個ずつ)
* tofohoto (15個のうち1個、15個ずつ)
* emte (1個ずつ、それぞれ)
====倍数====
倍数詞は〜倍を表します。基数詞の語末にubuあるいは、mudan、jergiを加えることによってできます。以下は全て2倍を表しています。
* juwe ubu
* juwe mudan
* juwe jergi
====分数====
分数詞は〜分の⋯を表します。“分の”を表現するには、属格i、あるいは奪格ciを、放在用基数詞で表された分母と分子の間に置きます。与位格deを倍数詞の間に置くことでも表現できます。
* sunja i emu (1/5)
* sunja ci emu (1/5)
* sunja ubu de emu ubu (1/5).
<!-- Navigation -->
<p style="background: #f2f2f2; border: 1px dashed #e6e6e6; padding-left: 3px; width: 100%; text-align: center;">
[[満洲語/レッスン3 - 代名詞]] ---- [[満洲語|メインページに戻る]] ---- [[満洲語/レッスン5 - 形容詞]]
</p>
<!-- END Navigation -->
[[Category:満洲語]]
omb4bd8gixksmi4x77idg6daty1mpvg
Wikijunior:大型ネコ/保護猫
0
48978
305226
2026-10-31T04:04:22Z
モチモチのキナコモチ
92391
ページの作成:「== 保護猫 == 保護猫とは、様々な事情で飼えなくなって保護されたり、野生から保護されたりする猫の総称です。また、保護施設は2種類あり、1つが慈善団体などの保護・譲渡を一貫して個人または集団で行うもので、2つ目が保健所という日本各地にある保護施設があります。 === 1,慈善団体系 === まず、慈善団体系の大前提として先ほど説明したよ…」
305226
wikitext
text/x-wiki
== 保護猫 ==
保護猫とは、様々な事情で飼えなくなって保護されたり、野生から保護されたりする猫の総称です。また、保護施設は2種類あり、1つが慈善団体などの保護・譲渡を一貫して個人または集団で行うもので、2つ目が保健所という日本各地にある保護施設があります。
=== 1,慈善団体系 ===
まず、慈善団体系の大前提として先ほど説明したように保護から譲渡を全て一貫して行なっています。
==== 保護 ====
慈善団体系が保護を行う条件として、このようなものがあります。
*住民などから依頼を受けたとき
*緊急・重大性があるとき
また、保健所から引き取ってお世話をする場合もあります。
慈善団体系の保護施設では、子猫や成猫、病気や障害を持つ猫などまで様々な猫がいます。しっかりお世話もされています。
==== 譲渡 ====
保護猫は不定期で行われる『譲渡会』というイベントで新しい家族との出会いを待っています。しかし、譲渡に成功するのはほんの一部だけで、なかなか里親が決まらない猫もいます。
=== 保健所 ===
保健所では保護した猫をゲージに入れ、一定期間が経つと殺処分(毎年数万匹が執行されている)されてしまいます。
==== 保護 ====
条件は慈善団体系とほぼ同じです。
==== 譲渡 ====
譲渡方法は、譲渡可能な猫が載っているサイトがあるのでまず、それを使って気になる猫を探します。見つけたら実際に会いに行き、飼えるかなどの条件を確認してから譲渡になります。
1ph3t5xxd5267zpi5ibf0luuersw0ix
305227
305226
2026-10-31T04:05:03Z
モチモチのキナコモチ
92391
/* 保健所 */
305227
wikitext
text/x-wiki
== 保護猫 ==
保護猫とは、様々な事情で飼えなくなって保護されたり、野生から保護されたりする猫の総称です。また、保護施設は2種類あり、1つが慈善団体などの保護・譲渡を一貫して個人または集団で行うもので、2つ目が保健所という日本各地にある保護施設があります。
=== 1,慈善団体系 ===
まず、慈善団体系の大前提として先ほど説明したように保護から譲渡を全て一貫して行なっています。
==== 保護 ====
慈善団体系が保護を行う条件として、このようなものがあります。
*住民などから依頼を受けたとき
*緊急・重大性があるとき
また、保健所から引き取ってお世話をする場合もあります。
慈善団体系の保護施設では、子猫や成猫、病気や障害を持つ猫などまで様々な猫がいます。しっかりお世話もされています。
==== 譲渡 ====
保護猫は不定期で行われる『譲渡会』というイベントで新しい家族との出会いを待っています。しかし、譲渡に成功するのはほんの一部だけで、なかなか里親が決まらない猫もいます。
=== 2,保健所 ===
保健所では保護した猫をゲージに入れ、一定期間が経つと殺処分(毎年数万匹が執行されている)されてしまいます。
==== 保護 ====
条件は慈善団体系とほぼ同じです。
==== 譲渡 ====
譲渡方法は、譲渡可能な猫が載っているサイトがあるのでまず、それを使って気になる猫を探します。見つけたら実際に会いに行き、飼えるかなどの条件を確認してから譲渡になります。
p3tvo3isluyokmwli4a4fq9vnk5g19f
Minecraft/アイアンゴーレム
0
48979
305228
2026-10-31T04:30:58Z
モチモチのキナコモチ
92391
ページの作成:「== アイアンゴーレム == アイアンゴーレムは、村(廃村を除く)に必ず1体湧く中立的なモブで、ゾンビなどの敵対的なモブを攻撃し、排除します。体にヒビが入ったアイアンゴーレムに鉄のインゴットを使うと、ヒビが消え、ゴーレムの体力が回復します。また、プレイヤーが攻撃を加えるとプレイヤーに対して敵対的になり、攻撃してきます。倒す…」
305228
wikitext
text/x-wiki
== アイアンゴーレム ==
アイアンゴーレムは、村(廃村を除く)に必ず1体湧く中立的なモブで、ゾンビなどの敵対的なモブを攻撃し、排除します。体にヒビが入ったアイアンゴーレムに鉄のインゴットを使うと、ヒビが消え、ゴーレムの体力が回復します。また、プレイヤーが攻撃を加えるとプレイヤーに対して敵対的になり、攻撃してきます。倒すと鉄インゴットと稀にポピーをドロップします。隠し要素として、村人にポピーを渡す仕草を見せることもあります。
pifcqwvh2ewe1vj0mo1sdm8s76emjl4