Wikibooks
jawikibooks
https://ja.wikibooks.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
MediaWiki 1.47.0-wmf.24
first-letter
メディア
特別
トーク
利用者
利用者・トーク
Wikibooks
Wikibooks・トーク
ファイル
ファイル・トーク
MediaWiki
MediaWiki・トーク
テンプレート
テンプレート・トーク
ヘルプ
ヘルプ・トーク
カテゴリ
カテゴリ・トーク
Transwiki
Transwiki‐ノート
TimedText
TimedText talk
モジュール
モジュール・トーク
Event
Event talk
民法第166条
0
4918
304717
297240
2026-10-14T17:09:58Z
Tomzo
248
304717
wikitext
text/x-wiki
[[法学]]>[[民事法]]>[[民法]]>[[コンメンタール民法]]>[[第1編 総則 (コンメンタール民法)]]
==条文==
(債権等の消滅時効)
;第166条
#[[債権]]は、次に掲げる場合には、時効によって消滅する。
##債権者が権利を行使することができることを知った時から5年間行使しないとき。
##権利を行使することができる時から10年間行使しないとき。
# 債権又は所有権以外の財産権は、権利を行使することができる時から20年間行使しないときは、時効によって消滅する。
# 前二項の規定は、始期付権利又は停止条件付権利の目的物を占有する第三者のために、その占有の開始の時から取得時効が進行することを妨げない。ただし、権利者は、その時効を更新するため、いつでも占有者の承認を求めることができる。
===改正経緯===
2017年改正前の条文及びその趣旨を取り込む旧第166条は以下のとおり。
(消滅時効の進行等)
;第166条
# 消滅時効は、権利を行使することができる時から進行する。
# 前項の規定は、始期付権利又は停止条件付権利の目的物を占有する第三者のために、その占有の開始の時から取得時効が進行することを妨げない。ただし、権利者は、その時効を中断するため、いつでも占有者の承認を求めることができる。
(債権等の消滅時効)
;第167条
# 債権は、十年間行使しないときは、消滅する。
# 債権又は[[所有権]]以外の[[財産権]]は、二十年間行使しないときは、消滅する。
==解説==
{{wikipedia|消滅時効}}
:'''[[消滅時効]]'''について定める。
:債権は、債権者が権利を行使できることを知った時(主観基準)から5年、権利を行使できる時から10年、行使をしないと消滅する。
:2017年改正前は、権利を行使できる時から(改正前第166条)、10年間行使をしない時(改正前第167条)消滅すると定めていた。一方で商行為に関しては5年間、その他細かく短期消滅時効となる時効が定められていて、適用局面で、しばしば争われた。同改正において、これらを一律に扱い、なおかつ時代に趨勢に合わせ、債権の時効について債権者側の主観基準で5年と定めたものである。
:消滅時効の対象は所有権を除く一切の財産権である。
:所有権については、[[取得時効]]の反対効果として喪失することはあっても、そのものが消滅時効にかからないと解されている。また判例によれば所有権が消滅時効にかからない以上、所有権に基づく物権的請求権及び登記請求権も消滅時効にかからないとされる([[#登記請求権|最判昭和51年11月5日]]、[[#遺留分|平成7年06月09日]])。
:その他、用益物権(地上権・永小作権・地役権 等)は「債権又は所有権以外の財産権」と概念され時効期間が20年と長く定められている。
:したがって、所有権及び用益物権以外の権利を広く債権と概念している。
:#形成権
:#:存続期間が定められているものはそれによる(取消権についての[[民法第126条|第126条]]など)が規定のない場合は、債権に準ずるとするのが判例・通説である。なお、形成権に関しては、消滅時効ではなく[[除斥期間]]であるともされ、消滅時効との取り扱いを異にする場合がある。
:#:形成権の結果生じた請求権については、請求権発生の時を基準に起算するとするのが判例であるが、批判も多い。
:#担保物件
:#:被担保債権に従う。抵当権については[[民法第396条|第396条]]を参照。
==参照条文==
*[[民法第146条]](時効の利益の放棄)
*[[民法第291条]](地役権の消滅時効)
*(廃止削除)[[民法第639条]](担保責任の存続期間の伸長)
*[[民法第724条]](不法行為による損害賠償請求権の期間の制限)
*[[民法第832条]](財産の管理について生じた親子間の債権の消滅時効)
**[[民法第875条]] - 第832条の準用
*(廃止削除)[[商法第522条]](商事消滅時効)
*[[健康保険法第193条]](時効)
*[[会計法第30条]]
{{債権消滅原因}}
==判例==
#[https://www.courts.go.jp/hanrei/57098/detail2/index.html 家督相続回復請求](最高裁判決 昭和23年11月06日)
#;家督相続回復請求権の消滅事項の起算点。
#:[[民法第996条#参考|民法第996条(旧法)]]の家督相続回復請求権の20年の時効は、相続権侵害の事実の有無にかゝわらず、相続開始の時から進行する。
#:*現在では、相続回復請求権一般の判例として機能。
#[https://www.courts.go.jp/hanrei/52932/detail2/index.html 物件引渡等請求](最高裁判決 昭和35年11月01日)
#;契約解除に基く原状回復の履行不能による損害賠償請求権の消滅時効の起算点。
#:契約解除に基く原状回復義務の履行不能による損害賠償請求権の消滅時効は、契約解除の時から進行する。
#[https://www.courts.go.jp/hanrei/53088/detail2/index.html 建物収去土地明渡請求上告事件](最高裁判決 昭和39年2月27日)
#;相続権を侵害された者の相続人が右侵害者に対して有する相続回復請求権の消滅時効の起算点。
#:甲の相続権を乙が侵害している場合、甲の相続人丙の乙に対する相続回復請求権の消滅時効の期間20年の起算点は、丙の相続開始の時ではなく、甲の相続開始の時と解すべきである。
#[https://www.courts.go.jp/hanrei/53979/detail2/index.html 普通財産売払代金請求](最高裁判決 昭和41年11月01日)[[会計法第30条]]
#;国の普通財産売払代金債権と会計法第30条
#:国の普通財産売払代金債権は、会計法第30条に規定する5年の消滅時効期間に服さない。
#[https://www.courts.go.jp/hanrei/70224/detail2/index.html 貸金請求](最高裁判決 昭和42年06月23日)
#;金銭債権の消滅時効の不完全事由としての弁済期の猶予の立証責任
#:債務者が抗弁として金銭債権が消滅時効の完成によつて消滅した旨を主張し、右抗弁が理由のある場合には、裁判所は、債権者において再抗弁として当該債務の弁済期の猶予があつた旨を主張しないかぎり、右猶予によつて消滅時効が完成しないものと判断することはできない。
#[https://www.courts.go.jp/hanrei/55006/detail2/index.html 貸金請求](最高裁判決 昭和42年06月23日)
#;いわゆる過怠約款を付した割賦払債務の消滅時効の起算点
#:割賦金弁済契約において、割賦払の約定に違反したときは債務者は債権者の請求により償還期限にかかわらず直ちに残債務全額を弁済すべき旨の約定がされた場合には、一回の不履行があつても、各割賦金債務について約定弁済期の到来ごとに順次消滅時効が進行し、債権者が特に残債務全額の弁済を求める旨の意思表示をしたときにかぎり、その時から右全額について消滅時効が進行するものと解すべきである。
#:*過怠約款を付した割賦払債務の消滅時効の起算点は、債権者が特に残債務全額の弁済を求める旨の意思表示をしたときである。
#[https://www.courts.go.jp/hanrei/55028/detail2/index.html 建物収去、土地明渡請求](最高裁判決 昭和42年07月20日)借地法第10条
#;借地法第10条による建物買取請求権の消滅時効期間
#:借地法第10条による建物買取請求権の消滅時効期間は10年と解すべきである。
#[https://www.courts.go.jp/hanrei/54984/detail2/index.html 求償金請求](最高裁判決 昭和42年10月06日)[[商法第522条]],[[信用保証協会法第20条]]
#;信用保証協会が保証債務の履行によつて取得する求償権と消滅時効
#:信用保証協会が商人である債務者の委任に基づいて成立した保証債務を履行した場合において、信用保証協会が取得する求償権は、[[商法第522条]]に定める5年の消滅時効にかかる。
#:*<u>2017年改正により、商事消滅時効は廃止された。</u>
#[https://www.courts.go.jp/hanrei/54004/detail2/index.html 供託金取戻請求の却下処分取消請求](最高裁判決 昭和45年07月15日)[[供託法第1条ノ3]],[[供託法第8条]]2項,[[供託規則38条]],[[民法第166条]]1項,[[民法第496条]]1項,[[行政事件訴訟法第3条]]2項,[[会計法第30条]]
##'''弁済供託における供託金取戻請求が供託官により却下された場合と訴訟の形式'''
##:弁済供託における供託金取戻請求が供託官により却下された場合には、供託官を被告として却下処分の取消の訴を提起することができる。
##'''弁済供託における供託金取戻請求権の消滅時効の起算点および期間'''
##:弁済供託における供託金取戻請求権の消滅時効は、供託の基礎となつた債務について紛争の解決などによつてその不存在が確定するなど、供託者が免責の効果を受ける必要が消滅した時から進行し、10年をもつて完成する。
#[https://www.courts.go.jp/hanrei/52015/detail2/index.html 土地建物抵当権設定登記抹消登記手続請求](最高裁判決 昭和48年12月14日)[[民法第145条]],[[民法第369条]]
#;抵当不動産の第三取得者と抵当権の被担保債権の消滅時効の援用
#:抵当不動産の譲渡を受けた第三者は、抵当権の被担保債権の消滅時効を援用することができる。
#:*2017年改正で本判例法理は[[民法第145条]]に取り込まれている。
#[https://www.courts.go.jp/hanrei/55149/detail2/index.html 損害賠償請求](最高裁判決 昭和49年12月17日)[[民法第724条]],[[商法第266条の3]]第1項(現[[会社法第429条]])
#;商法266条の3第1項前段所定の第三者の取締役に対する損害賠償請求権の消滅時効期間
#:商法266条の3第1項前段所定の第三者の取締役に対する損害賠償請求権の消滅時効期間は10年と解すべきである。
#[https://www.courts.go.jp/hanrei/55145/detail2/index.html 損害賠償請求](最高裁判決 昭和49年12月20日)
#;準禁治産者が訴を提起するにつき保佐人の同意を得られない場合と消滅時効の進行
#:準禁治産者である権利者が保佐人の同意を得られないため訴を提起できない場合でも、その権利についての消滅時効の進行は妨げられない。
#[https://www.courts.go.jp/hanrei/52111/detail2/index.html 損害賠償請求](通称 自衛隊八戸車両整備工場損害賠償/[[w:安全配慮義務#陸上自衛隊事件|陸上自衛隊事件]] 最高裁判決 昭和50年02月25日)[[民法第1条]]2項,[[国家公務員法第93条|国家公務員法第3章第6節第3款第3目]],[[会計法第30条]]
##'''国の国家公務員に対する安全配慮義務の有無'''
##:国は、国家公務員に対し、その公務遂行のための場所、施設若しくは器具等の設置管理又はその遂行する公務の管理にあたつて、国家公務員の生命及び健康等を危険から保護するよう配慮すべき義務を負つているものと解すべきである。
##'''国の安全配慮義務違背を理由とする国家公務員の国に対する損害賠償請求権の消滅時効期間'''
##:国の安全配慮義務違背を理由とする国家公務員の国に対する損害賠償請求権の消滅時効期間は、10年と解すべきである。
##:*会計法30条が金銭の給付を目的とする国の権利及び国に対する権利につき5年の消滅時効期間を定めたのは、国の権利義務を早期に決済する必要があるなど主として行政上の便宜を考慮したことに基づくものであるから、同条の5年の消滅時効期間の定めは、右のような行政上の便宜を考慮する必要がある金銭債権であつて他に時効期間につき特別の規定のないものについて適用されるものと解すべきである。
#[https://www.courts.go.jp/hanrei/52124/detail2/index.html 土地所有権確認等請求](最高裁判決 昭和50年04月11日)[[農地法第3条]]
#;農地の買主が売主に対して有する知事に対する所有権移転許可申請協力請求権と消滅時効
#:農地の買主が売主に対して有する知事に対する農地所有権移転許可申請協力請求権は、民法167条1項所定の債権にあたる。
#<span id="登記請求権"></span>[https://www.courts.go.jp/hanrei/64138/detail2/index.html 土地所有権確認等請求](最高裁判決 昭和51年11月05日)[[民法第177条]]
#;所有権移転登記請求権と消滅時効
#:不動産の譲渡による所有権移転登記請求権は、右譲渡によつて生じた所有権移転の事実が存する限り独立して消滅時効にかからない。
#[https://www.courts.go.jp/hanrei/53316/detail2/index.html 不当利得金返還](最高裁判決 昭和55年01月24日)[[民法第703条]],[[商法第522条]],[[利息制限法第1条]],[[利息制限法第4条]]
#;商行為である金銭消費貸借に関し利息制限法所定の制限を超えて支払われた利息・損害金についての不当利得返還請求権の消滅時効期間
#:商行為である金銭消費貸借に関し利息制限法所定の制限を超えて支払われた利息・損害金についての不当利得返還請求権の消滅時効期間は、10年と解すべきである。
#:*商行為であるならば商事消滅時効の適用があるべきとして争われた案件であるが、2017年改正により、商事消滅時効は廃止されたため、現在は判例として機能していない。
#[https://www.courts.go.jp/hanrei/53349/detail2/index.html 約束手形金](最高裁判決 昭和55年05月30日)[[手形法第70条]]2項,[[手形法第77条]]1項8号
#;約束手形の所持人と裏書人との間において支払猶予の特約がされた場合と所持人の裏書人に対する手形上の請求権の消滅時効の起算点
#:約束手形の所持人と裏書人との間において裏書人の手形上の債務につき支払猶予の特約がされた場合には、所持人の裏書人に対する手形上の請求権の消滅時効は、右猶予期間が満了した時から進行する。
#[https://www.courts.go.jp/hanrei/53333/detail2/index.html 建物収去土地明渡等](最高裁判決 昭和56年06月16日)[[民法第541条]]
#;継続した地代不払を一括して一個の解除原因とする賃貸借契約の解除権の消滅時効の起算点
#:継続した地代不払を一括して一個の解除原因とする賃貸借契約の解除権の消滅時効は、最後の地代の支払期日が経過した時から進行する。
#[https://www.courts.go.jp/hanrei/54254/detail2/index.html 所有権移転登記手続](最高裁判決 昭和57年01月22日)[[民法第369条]](譲渡担保)
#;譲渡担保を設定した債務者の目的不動産に対するいわゆる受戻権と民法167条2項(改正前)の規定の適用の可否
#:譲渡担保を設定した債務者による債務の弁済と右弁済に伴う目的不動産の返還請求権とを合体し、一個の形成権たる受戻権として、これに民法167条2項(改正前)の規定を適用することはできない。
#[https://www.courts.go.jp/hanrei/52187/detail2/index.html 所有権移転請求権保全仮登記抹消登記手続等本訴、所有権移転請求権保全仮登記本登記手続反訴](最高裁判決 昭和61年03月17日)[[民法第145条]]1項,[[農地法第3条]]1項
#;農地の売買に基づく県知事に対する所有権移転許可申請協力請求権の消滅時効期間の経過後に右農地が非農地化した場合における所有権の移転及び非農地化後にされた時効援用の効力の有無
#:農地の売買に基づく県知事に対する所有権移転許可申請協力請求権の消滅時効期間が経過してもその後に右農地が非農地化した場合には、買主に所有権が移転し、非農地化後にされた時効の援用は効力を生じない。
#[https://www.courts.go.jp/hanrei/62631/detail2/index.html 保険金返還](最高裁判決 平成3年04月26日)[[民法第703条]],[[商法第522条]],[[商法第641条]]
#;商行為たる船体保険契約及び質権設定契約に基づき保険者から質権者に支払われた保険金に関する不当利得返還請求権の消滅時効期間
#:法定の免責事由があるにもかかわらず、商行為たる船体保険契約及び質権設定契約に基づき保険者から質権者に保険金が支払われた場合の不当利得返還請求権の消滅時効期間は、10年である。
#<span id="遺留分"></span>[https://www.courts.go.jp/hanrei/76118/detail2/index.html 共有持分移転登記手続](最高裁判決 平成7年06月09日)[[民法第884条]],[[民法第1042条]]
#;遺留分減殺請求により取得した不動産の所有権又は共有持分権に基づく登記請求権と消滅時効
#:遺留分権利者が減殺請求により取得した不動産の所有権又は共有持分権に基づく登記請求権は、時効によって消滅することはない。
#[https://www.courts.go.jp/hanrei/55858/detail2/index.html ゴルフ会員権確認](最高裁判決 平成7年09月05日)民法第第3編第2章契約
#;預託金会員制ゴルフクラブの施設利用権の消滅時効と会員権の消長
#:預託金会員制ゴルフクラブの施設利用権の消滅時効は、会員が施設の利用をしない状態が継続したことのみによっては進行せず、ゴルフ場経営会社が、会員に対してその資格を否定して施設の利用を拒絶し、あるいは会員の利用を不可能な状態としたような時から進行し、右利用権が時効により消滅したときは、ゴルフ会員権は、包括的権利としては存続し得ない。
#[https://www.courts.go.jp/hanrei/55869/detail2/index.html 損害填補](最高裁判決 平成8年03月05日)[[自動車損害賠償保障法第3条]],自動車損害賠償保障法(平成7年法第律第137号による改正前のもの)72条,自動車損害賠償保障法(平成7年法律第137号による改正前のもの)75条
#;ある者が交通事故の加害自動車の保有者であるか否かをめぐって争いがある場合における自動車損害賠償保障法72条1項前段による請求権の消滅時効の起算点
#:自動車損害賠償保障法72条1項前段による請求権の消滅時効は、ある者が交通事故の加害自動車の保有者であるか否かをめぐって、右の者と当該交通事故の被害者との間で同法3条による損害賠償請求権の存否が争われている場合においては、右損害賠償請求権が存在しないことが確定した時から進行する。
#<span id="最高裁判決平成11年11月09日"/>[https://www.courts.go.jp/hanrei/52612/detail2/index.html 求償債権請求事件](最高裁判決 平成11年11月09日)[[民法第145条]],[[民法第446条]],破産法第366条ノ12,破産法第366条ノ13
#;破産免責の効力の及ぶ債務の保証人とその債権の消滅時効の援用
#:主債務者である破産者が免責決定を受けた場合に、免責決定の効力の及ぶ債務の保証人は、その債権についての消滅時効を援用することができない。
#[https://www.courts.go.jp/hanrei/52245/detail2/index.html 供託金取戻却下決定取消請求事件](最高裁判決 平成13年11月27日)[[供託法8条]]2項,旧・[[民法第167条]]1項,旧。[[民法第169条]],[[民法第496条]]1項
##'''弁済供託における供託金取戻請求権の消滅時効の起算点'''
##:弁済供託における供託金取戻請求権の消滅時効は,過失なくして債権者を確知することができないことを原因とする弁済供託の場合を含め,供託者が免責の効果を受ける必要が消滅した時から進行する。
##'''債権者不確知を原因とする弁済供託に係る供託金取戻請求の却下処分が違法とされた事例'''
##:過失なくして債権者を確知することができないことを原因として賃料債務についてされた弁済供託につき,同債務の各弁済期の翌日から民法169条(改正前)所定の5年の時効期間が経過した時から更に10年が経過する前にされた供託金取戻請求に対し,同取戻請求権の消滅時効が完成したとしてこれを却下した処分は,違法である。
#[https://www.courts.go.jp/hanrei/52228/detail2/index.html 損害賠償請求事件](最高裁判決 平成13年11月27日)[[民法第566条]]3項,[[民法第570条]]
#;瑕疵担保による損害賠償請求権と消滅時効
#:瑕疵担保による損害賠償請求権には消滅時効の規定の適用がある
#*2017年改正後、契約不適合責任にも適用される。
#[https://www.courts.go.jp/hanrei/52331/detail2/index.html 求償金請求事件](最高裁判決 平成15年03月14日)[[民法第145条]],[[民法第446条]],[[破産法第4条]],[[破産法第282条]]
#;破産終結決定がされて法人格が消滅した会社を主債務者とする保証人が主債務の消滅時効を援用することの可否
#:破産終結決定がされて法人格が消滅した会社を主債務者とする保証人は,主債務についての消滅時効が会社の法人格の消滅後に完成したことを主張してこれを援用することはできない。
#[https://www.courts.go.jp/hanrei/52324/detail2/index.html 補償金請求事件](最高裁判決 平成15年04月22日)[[特許法第35条]]
##'''職務発明について特許を受ける権利等を使用者等に承継させた従業者等が勤務規則その他の定めによる対価の額が特許法35条3項及び4項の規定に従って定められる相当の対価の額に満たないときに不足額を請求することの可否'''
##:使用者等があらかじめ定める勤務規則その他の定めにより職務発明について特許を受ける権利又は特許権を使用者等に承継させた従業者等は,当該勤務規則その他の定めに使用者等が従業者等に対して支払うべき対価に関する条項がある場合においても,これによる対価の額が特許法35条3項及び4項の規定に従って定められる相当の対価の額に満たないときは,同条3項の規定に基づき,その不足する額に相当する対価の支払を求めることができる。
##'''勤務規則その他の定めに対価の支払時期に関する条項がある場合における特許法35条3項の規定による相当の対価の支払を受ける権利の消滅時効の起算点'''
##:特許法35条3項の規定による相当の対価の支払を受ける権利の消滅時効は,使用者等があらかじめ定める勤務規則その他の定めに対価の支払時期に関する条項がある場合には,その支払時期から進行する。
#[https://www.courts.go.jp/hanrei/52297/detail2/index.html 保険金請求事件](最高裁判決 平成15年12月11日)[[商法第663条]],[[商法第683条]]1項,[[民法第91条]]
##'''生命保険契約において被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨を定めている保険約款の解釈'''
##生命保険契約に係る保険約款中の被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨の定めは,当時の客観的状況等に照らし,上記死亡の時からの保険金請求権の行使が現実に期待することができないような特段の事情が存する場合には,その権利行使が現実に期待することができるようになった時以降において上記消滅時効が進行する趣旨と解すべきである。
##'''生命保険契約に係る保険約款が被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨を定めている場合であっても上記消滅時効は被保険者の遺体が発見されるまでの間は進行しないとされた事例'''
##:生命保険契約に係る保険約款が被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨を定めている場合であっても,被保険者が自動車を運転して外出したまま帰宅せず,その行方,消息については何の手掛かりもなく,その生死も不明であったが,行方不明になってから3年以上経過してから,峠の展望台の下方約120mの雑木林の中で,自動車と共に白骨化した遺体となって発見されたなど判示の事実関係の下では,上記消滅時効は,被保険者の遺体が発見されるまでの間は進行しない。
#[https://www.courts.go.jp/hanrei/34552/detail2/index.html 預金払戻請求事件](最高裁判決 平成19年04月24日)[[民法第91条]],[[民法第666条]]
#;いわゆる自動継続特約付きの定期預金契約における預金払戻請求権の消滅時効の起算点
#:いわゆる自動継続特約付きの定期預金契約における預金払戻請求権の消滅時効は,それ以降自動継続の取扱いがされることのなくなった満期日が到来した時から進行する。
#[https://www.courts.go.jp/hanrei/35631/detail2/index.html 損害賠償請求事件](最高裁判決 平成20年01月28日)商法522条,商法(平成17年法律第87号による改正前のもの)254条3項,商法(平成17年法律第87号による改正前のもの)254条ノ3,商法(平成17年法律第87号による改正前のもの)266条1項5号,'''[[会社法第423条]]第1項,[[会社法第430条]]'''
#;商法266条1項5号に基づく会社の取締役に対する損害賠償請求権の消滅時効期間
#:商法266条1項5号に基づく会社の取締役に対する損害賠償請求権の消滅時効期間は,民法167条1項により10年と解すべきである。
#[https://www.courts.go.jp/hanrei/37212/detail2/index.html 不当利得返還等請求事件](最高裁判決 平成21年01月22日)[[民法第703条]],[[利息制限法第1条]]1項
#;継続的な金銭消費貸借取引に関する基本契約が,利息制限法所定の制限を超える利息の弁済により発生した過払金をその後に発生する新たな借入金債務に充当する旨の合意を含む場合における,上記取引により生じた過払金返還請求権の消滅時効の起算点
#:継続的な金銭消費貸借取引に関する基本契約が,借入金債務につき利息制限法1条1項所定の制限を超える利息の弁済により過払金が発生したときには,弁済当時他の借入金債務が存在しなければ上記過払金をその後に発生する新たな借入金債務に充当する旨の合意を含む場合は,上記取引により生じた過払金返還請求権の消滅時効は,特段の事情がない限り,上記取引が終了した時から進行する。
#[https://www.courts.go.jp/hanrei/87485/detail2/index.html 建物根抵当権設定仮登記抹消登記手続請求事件](最高裁判決 平成30年2月23日)[[民法第396条]],[[破産法第253条]]1項本文
#;抵当権の被担保債権が免責許可の決定の効力を受ける場合における当該抵当権自体の消滅時効
#:抵当権の被担保債権が免責許可の決定の効力を受ける場合には,民法396条は適用されず,債務者及び抵当権設定者に対する関係においても,当該抵当権自体が,同法167条2項所定の20年の消滅時効にかかる。
----
{{前後
|[[コンメンタール民法|民法]]
|[[第1編 総則 (コンメンタール民法)|第1編 総則]]<br>
[[第1編 総則 (コンメンタール民法)#7|第7章 時効]]<br>
[[第1編 総則 (コンメンタール民法)#7-3|第3節 消滅時効]]
|[[民法第165条]]<br>(占有の中止等による取得時効の中断)
|[[民法第167条]]<br>(人の生命又は身体の侵害による損害賠償請求権の消滅時効)
}}
{{stub|law}}
[[category:民法|166]]
[[category:民法 2017年改正|166]]
hsqcfngxavm6lys7d3m1nb1bcbb1m0a
304718
304717
2026-10-14T17:56:52Z
Tomzo
248
304718
wikitext
text/x-wiki
[[法学]]>[[民事法]]>[[民法]]>[[コンメンタール民法]]>[[第1編 総則 (コンメンタール民法)]]
==条文==
(債権等の消滅時効)
;第166条
#[[債権]]は、次に掲げる場合には、時効によって消滅する。
##債権者が権利を行使することができることを知った時から5年間行使しないとき。
##権利を行使することができる時から10年間行使しないとき。
# 債権又は所有権以外の財産権は、権利を行使することができる時から20年間行使しないときは、時効によって消滅する。
# 前二項の規定は、始期付権利又は停止条件付権利の目的物を占有する第三者のために、その占有の開始の時から取得時効が進行することを妨げない。ただし、権利者は、その時効を更新するため、いつでも占有者の承認を求めることができる。
===改正経緯===
2017年改正前の条文及びその趣旨を取り込む旧第166条は以下のとおり。
(消滅時効の進行等)
;第166条
# 消滅時効は、権利を行使することができる時から進行する。
# 前項の規定は、始期付権利又は停止条件付権利の目的物を占有する第三者のために、その占有の開始の時から取得時効が進行することを妨げない。ただし、権利者は、その時効を中断するため、いつでも占有者の承認を求めることができる。
(債権等の消滅時効)
;第167条
# 債権は、十年間行使しないときは、消滅する。
# 債権又は[[所有権]]以外の[[財産権]]は、二十年間行使しないときは、消滅する。
==解説==
{{wikipedia|消滅時効}}
:債権及び債権・所有権以外の財産権(物権)の'''[[消滅時効]]'''について定める。
:債権は、債権者が権利を行使できることを知った時(主観基準)から5年、権利を行使できる時から10年、行使をしないと消滅する。
:2017年改正前は、権利を行使できる時から(改正前第166条)、10年間行使をしない時(改正前第167条)消滅すると定めていた。しかしながら、商行為に関しては5年間とされ([[商法第522条]](商事消滅時効);2017年改正により削除廃止)、適用局面で、いずれを適用するかしばしば争われた。また、争いが少額となる案件を細かく分類して消滅時効の期間を短期とする'''短期消滅時効'''が定められていたが、少額であるゆえに訴訟までに至る例はごく稀であり、その存在意義が疑われていた。同改正において、これらを一律に扱い、なおかつ時代に趨勢に合わせ、債権の時効について債権者側の主観基準で5年と定めたものである。短期消滅時効を主滅させることができた背景としては、1998年(平成10年)の[[少額訴訟制度]]導入が大きい。
:債権以外の財産権に関して、所有権については、[[取得時効]]の反対効果として喪失することはあっても、そのものが消滅時効にかからないと解されている。また判例によれば所有権が消滅時効にかからない以上、所有権に基づく物権的請求権及び登記請求権も消滅時効にかからないとされる([[#登記請求権|最判昭和51年11月5日]]、[[#遺留分|平成7年06月09日]])。
:その他、用益物権(地上権・永小作権・地役権 等)は「債権又は所有権以外の財産権」と概念され時効期間が20年と長く定められている。
:その他の権利の消滅時効について例示する。
:#形成権
:#:存続期間が定められているものはそれによる(取消権についての[[民法第126条|第126条]]など)が規定のない場合は、債権に準ずるとするのが判例・通説である。なお、形成権に関しては、消滅時効ではなく[[除斥期間]]であるともされ、消滅時効との取り扱いを異にする場合がある。
:#:形成権の結果生じた請求権については、請求権発生の時を基準に起算するとするのが判例であるが、批判も多い。
:#担保物件
:#:被担保債権に従う。抵当権については[[民法第396条|第396条]]を参照。
==参照条文==
*[[民法第146条]](時効の利益の放棄)
*[[民法第291条]](地役権の消滅時効)
*(廃止削除)[[民法第639条]](担保責任の存続期間の伸長)
*[[民法第724条]](不法行為による損害賠償請求権の期間の制限)
*[[民法第832条]](財産の管理について生じた親子間の債権の消滅時効)
**[[民法第875条]] - 第832条の準用
*[[健康保険法第193条]](時効)
*[[会計法第30条]]
{{債権消滅原因}}
==判例==
#[https://www.courts.go.jp/hanrei/57098/detail2/index.html 家督相続回復請求](最高裁判決 昭和23年11月06日)
#;家督相続回復請求権の消滅事項の起算点。
#:[[民法第996条#参考|民法第996条(旧法)]]の家督相続回復請求権の20年の時効は、相続権侵害の事実の有無にかゝわらず、相続開始の時から進行する。
#:*現在では、相続回復請求権一般の判例として機能。
#[https://www.courts.go.jp/hanrei/52932/detail2/index.html 物件引渡等請求](最高裁判決 昭和35年11月01日)
#;契約解除に基く原状回復の履行不能による損害賠償請求権の消滅時効の起算点。
#:契約解除に基く原状回復義務の履行不能による損害賠償請求権の消滅時効は、契約解除の時から進行する。
#[https://www.courts.go.jp/hanrei/53088/detail2/index.html 建物収去土地明渡請求上告事件](最高裁判決 昭和39年2月27日)
#;相続権を侵害された者の相続人が右侵害者に対して有する相続回復請求権の消滅時効の起算点。
#:甲の相続権を乙が侵害している場合、甲の相続人丙の乙に対する相続回復請求権の消滅時効の期間20年の起算点は、丙の相続開始の時ではなく、甲の相続開始の時と解すべきである。
#[https://www.courts.go.jp/hanrei/53979/detail2/index.html 普通財産売払代金請求](最高裁判決 昭和41年11月01日)[[会計法第30条]]
#;国の普通財産売払代金債権と会計法第30条
#:国の普通財産売払代金債権は、会計法第30条に規定する5年の消滅時効期間に服さない。
#[https://www.courts.go.jp/hanrei/70224/detail2/index.html 貸金請求](最高裁判決 昭和42年06月23日)
#;金銭債権の消滅時効の不完全事由としての弁済期の猶予の立証責任
#:債務者が抗弁として金銭債権が消滅時効の完成によつて消滅した旨を主張し、右抗弁が理由のある場合には、裁判所は、債権者において再抗弁として当該債務の弁済期の猶予があつた旨を主張しないかぎり、右猶予によつて消滅時効が完成しないものと判断することはできない。
#[https://www.courts.go.jp/hanrei/55006/detail2/index.html 貸金請求](最高裁判決 昭和42年06月23日)
#;いわゆる過怠約款を付した割賦払債務の消滅時効の起算点
#:割賦金弁済契約において、割賦払の約定に違反したときは債務者は債権者の請求により償還期限にかかわらず直ちに残債務全額を弁済すべき旨の約定がされた場合には、一回の不履行があつても、各割賦金債務について約定弁済期の到来ごとに順次消滅時効が進行し、債権者が特に残債務全額の弁済を求める旨の意思表示をしたときにかぎり、その時から右全額について消滅時効が進行するものと解すべきである。
#:*過怠約款を付した割賦払債務の消滅時効の起算点は、債権者が特に残債務全額の弁済を求める旨の意思表示をしたときである。
#[https://www.courts.go.jp/hanrei/55028/detail2/index.html 建物収去、土地明渡請求](最高裁判決 昭和42年07月20日)借地法第10条
#;借地法第10条による建物買取請求権の消滅時効期間
#:借地法第10条による建物買取請求権の消滅時効期間は10年と解すべきである。
#[https://www.courts.go.jp/hanrei/54984/detail2/index.html 求償金請求](最高裁判決 昭和42年10月06日)[[商法第522条]],[[信用保証協会法第20条]]
#;信用保証協会が保証債務の履行によつて取得する求償権と消滅時効
#:信用保証協会が商人である債務者の委任に基づいて成立した保証債務を履行した場合において、信用保証協会が取得する求償権は、[[商法第522条]]に定める5年の消滅時効にかかる。
#:*<u>2017年改正により、商事消滅時効は廃止された。</u>
#[https://www.courts.go.jp/hanrei/54004/detail2/index.html 供託金取戻請求の却下処分取消請求](最高裁判決 昭和45年07月15日)[[供託法第1条ノ3]],[[供託法第8条]]2項,[[供託規則38条]],[[民法第166条]]1項,[[民法第496条]]1項,[[行政事件訴訟法第3条]]2項,[[会計法第30条]]
##'''弁済供託における供託金取戻請求が供託官により却下された場合と訴訟の形式'''
##:弁済供託における供託金取戻請求が供託官により却下された場合には、供託官を被告として却下処分の取消の訴を提起することができる。
##'''弁済供託における供託金取戻請求権の消滅時効の起算点および期間'''
##:弁済供託における供託金取戻請求権の消滅時効は、供託の基礎となつた債務について紛争の解決などによつてその不存在が確定するなど、供託者が免責の効果を受ける必要が消滅した時から進行し、10年をもつて完成する。
#[https://www.courts.go.jp/hanrei/52015/detail2/index.html 土地建物抵当権設定登記抹消登記手続請求](最高裁判決 昭和48年12月14日)[[民法第145条]],[[民法第369条]]
#;抵当不動産の第三取得者と抵当権の被担保債権の消滅時効の援用
#:抵当不動産の譲渡を受けた第三者は、抵当権の被担保債権の消滅時効を援用することができる。
#:*2017年改正で本判例法理は[[民法第145条]]に取り込まれている。
#[https://www.courts.go.jp/hanrei/55149/detail2/index.html 損害賠償請求](最高裁判決 昭和49年12月17日)[[民法第724条]],[[商法第266条の3]]第1項(現[[会社法第429条]])
#;商法266条の3第1項前段所定の第三者の取締役に対する損害賠償請求権の消滅時効期間
#:商法266条の3第1項前段所定の第三者の取締役に対する損害賠償請求権の消滅時効期間は10年と解すべきである。
#[https://www.courts.go.jp/hanrei/55145/detail2/index.html 損害賠償請求](最高裁判決 昭和49年12月20日)
#;準禁治産者が訴を提起するにつき保佐人の同意を得られない場合と消滅時効の進行
#:準禁治産者である権利者が保佐人の同意を得られないため訴を提起できない場合でも、その権利についての消滅時効の進行は妨げられない。
#[https://www.courts.go.jp/hanrei/52111/detail2/index.html 損害賠償請求](通称 自衛隊八戸車両整備工場損害賠償/[[w:安全配慮義務#陸上自衛隊事件|陸上自衛隊事件]] 最高裁判決 昭和50年02月25日)[[民法第1条]]2項,[[国家公務員法第93条|国家公務員法第3章第6節第3款第3目]],[[会計法第30条]]
##'''国の国家公務員に対する安全配慮義務の有無'''
##:国は、国家公務員に対し、その公務遂行のための場所、施設若しくは器具等の設置管理又はその遂行する公務の管理にあたつて、国家公務員の生命及び健康等を危険から保護するよう配慮すべき義務を負つているものと解すべきである。
##'''国の安全配慮義務違背を理由とする国家公務員の国に対する損害賠償請求権の消滅時効期間'''
##:国の安全配慮義務違背を理由とする国家公務員の国に対する損害賠償請求権の消滅時効期間は、10年と解すべきである。
##:*会計法30条が金銭の給付を目的とする国の権利及び国に対する権利につき5年の消滅時効期間を定めたのは、国の権利義務を早期に決済する必要があるなど主として行政上の便宜を考慮したことに基づくものであるから、同条の5年の消滅時効期間の定めは、右のような行政上の便宜を考慮する必要がある金銭債権であつて他に時効期間につき特別の規定のないものについて適用されるものと解すべきである。
#[https://www.courts.go.jp/hanrei/52124/detail2/index.html 土地所有権確認等請求](最高裁判決 昭和50年04月11日)[[農地法第3条]]
#;農地の買主が売主に対して有する知事に対する所有権移転許可申請協力請求権と消滅時効
#:農地の買主が売主に対して有する知事に対する農地所有権移転許可申請協力請求権は、民法167条1項所定の債権にあたる。
#<span id="登記請求権"></span>[https://www.courts.go.jp/hanrei/64138/detail2/index.html 土地所有権確認等請求](最高裁判決 昭和51年11月05日)[[民法第177条]]
#;所有権移転登記請求権と消滅時効
#:不動産の譲渡による所有権移転登記請求権は、右譲渡によつて生じた所有権移転の事実が存する限り独立して消滅時効にかからない。
#[https://www.courts.go.jp/hanrei/53316/detail2/index.html 不当利得金返還](最高裁判決 昭和55年01月24日)[[民法第703条]],[[商法第522条]],[[利息制限法第1条]],[[利息制限法第4条]]
#;商行為である金銭消費貸借に関し利息制限法所定の制限を超えて支払われた利息・損害金についての不当利得返還請求権の消滅時効期間
#:商行為である金銭消費貸借に関し利息制限法所定の制限を超えて支払われた利息・損害金についての不当利得返還請求権の消滅時効期間は、10年と解すべきである。
#:*商行為であるならば商事消滅時効の適用があるべきとして争われた案件であるが、2017年改正により、商事消滅時効は廃止されたため、現在は判例として機能していない。
#[https://www.courts.go.jp/hanrei/53349/detail2/index.html 約束手形金](最高裁判決 昭和55年05月30日)[[手形法第70条]]2項,[[手形法第77条]]1項8号
#;約束手形の所持人と裏書人との間において支払猶予の特約がされた場合と所持人の裏書人に対する手形上の請求権の消滅時効の起算点
#:約束手形の所持人と裏書人との間において裏書人の手形上の債務につき支払猶予の特約がされた場合には、所持人の裏書人に対する手形上の請求権の消滅時効は、右猶予期間が満了した時から進行する。
#[https://www.courts.go.jp/hanrei/53333/detail2/index.html 建物収去土地明渡等](最高裁判決 昭和56年06月16日)[[民法第541条]]
#;継続した地代不払を一括して一個の解除原因とする賃貸借契約の解除権の消滅時効の起算点
#:継続した地代不払を一括して一個の解除原因とする賃貸借契約の解除権の消滅時効は、最後の地代の支払期日が経過した時から進行する。
#[https://www.courts.go.jp/hanrei/54254/detail2/index.html 所有権移転登記手続](最高裁判決 昭和57年01月22日)[[民法第369条]](譲渡担保)
#;譲渡担保を設定した債務者の目的不動産に対するいわゆる受戻権と民法167条2項(改正前)の規定の適用の可否
#:譲渡担保を設定した債務者による債務の弁済と右弁済に伴う目的不動産の返還請求権とを合体し、一個の形成権たる受戻権として、これに民法167条2項(改正前)の規定を適用することはできない。
#[https://www.courts.go.jp/hanrei/52187/detail2/index.html 所有権移転請求権保全仮登記抹消登記手続等本訴、所有権移転請求権保全仮登記本登記手続反訴](最高裁判決 昭和61年03月17日)[[民法第145条]]1項,[[農地法第3条]]1項
#;農地の売買に基づく県知事に対する所有権移転許可申請協力請求権の消滅時効期間の経過後に右農地が非農地化した場合における所有権の移転及び非農地化後にされた時効援用の効力の有無
#:農地の売買に基づく県知事に対する所有権移転許可申請協力請求権の消滅時効期間が経過してもその後に右農地が非農地化した場合には、買主に所有権が移転し、非農地化後にされた時効の援用は効力を生じない。
#[https://www.courts.go.jp/hanrei/62631/detail2/index.html 保険金返還](最高裁判決 平成3年04月26日)[[民法第703条]],[[商法第522条]],[[商法第641条]]
#;商行為たる船体保険契約及び質権設定契約に基づき保険者から質権者に支払われた保険金に関する不当利得返還請求権の消滅時効期間
#:法定の免責事由があるにもかかわらず、商行為たる船体保険契約及び質権設定契約に基づき保険者から質権者に保険金が支払われた場合の不当利得返還請求権の消滅時効期間は、10年である。
#<span id="遺留分"></span>[https://www.courts.go.jp/hanrei/76118/detail2/index.html 共有持分移転登記手続](最高裁判決 平成7年06月09日)[[民法第884条]],[[民法第1042条]]
#;遺留分減殺請求により取得した不動産の所有権又は共有持分権に基づく登記請求権と消滅時効
#:遺留分権利者が減殺請求により取得した不動産の所有権又は共有持分権に基づく登記請求権は、時効によって消滅することはない。
#[https://www.courts.go.jp/hanrei/55858/detail2/index.html ゴルフ会員権確認](最高裁判決 平成7年09月05日)民法第第3編第2章契約
#;預託金会員制ゴルフクラブの施設利用権の消滅時効と会員権の消長
#:預託金会員制ゴルフクラブの施設利用権の消滅時効は、会員が施設の利用をしない状態が継続したことのみによっては進行せず、ゴルフ場経営会社が、会員に対してその資格を否定して施設の利用を拒絶し、あるいは会員の利用を不可能な状態としたような時から進行し、右利用権が時効により消滅したときは、ゴルフ会員権は、包括的権利としては存続し得ない。
#[https://www.courts.go.jp/hanrei/55869/detail2/index.html 損害填補](最高裁判決 平成8年03月05日)[[自動車損害賠償保障法第3条]],自動車損害賠償保障法(平成7年法第律第137号による改正前のもの)72条,自動車損害賠償保障法(平成7年法律第137号による改正前のもの)75条
#;ある者が交通事故の加害自動車の保有者であるか否かをめぐって争いがある場合における自動車損害賠償保障法72条1項前段による請求権の消滅時効の起算点
#:自動車損害賠償保障法72条1項前段による請求権の消滅時効は、ある者が交通事故の加害自動車の保有者であるか否かをめぐって、右の者と当該交通事故の被害者との間で同法3条による損害賠償請求権の存否が争われている場合においては、右損害賠償請求権が存在しないことが確定した時から進行する。
#<span id="最高裁判決平成11年11月09日"/>[https://www.courts.go.jp/hanrei/52612/detail2/index.html 求償債権請求事件](最高裁判決 平成11年11月09日)[[民法第145条]],[[民法第446条]],破産法第366条ノ12,破産法第366条ノ13
#;破産免責の効力の及ぶ債務の保証人とその債権の消滅時効の援用
#:主債務者である破産者が免責決定を受けた場合に、免責決定の効力の及ぶ債務の保証人は、その債権についての消滅時効を援用することができない。
#[https://www.courts.go.jp/hanrei/52245/detail2/index.html 供託金取戻却下決定取消請求事件](最高裁判決 平成13年11月27日)[[供託法8条]]2項,旧・[[民法第167条]]1項,旧。[[民法第169条]],[[民法第496条]]1項
##'''弁済供託における供託金取戻請求権の消滅時効の起算点'''
##:弁済供託における供託金取戻請求権の消滅時効は,過失なくして債権者を確知することができないことを原因とする弁済供託の場合を含め,供託者が免責の効果を受ける必要が消滅した時から進行する。
##'''債権者不確知を原因とする弁済供託に係る供託金取戻請求の却下処分が違法とされた事例'''
##:過失なくして債権者を確知することができないことを原因として賃料債務についてされた弁済供託につき,同債務の各弁済期の翌日から民法169条(改正前)所定の5年の時効期間が経過した時から更に10年が経過する前にされた供託金取戻請求に対し,同取戻請求権の消滅時効が完成したとしてこれを却下した処分は,違法である。
#[https://www.courts.go.jp/hanrei/52228/detail2/index.html 損害賠償請求事件](最高裁判決 平成13年11月27日)[[民法第566条]]3項,[[民法第570条]]
#;瑕疵担保による損害賠償請求権と消滅時効
#:瑕疵担保による損害賠償請求権には消滅時効の規定の適用がある
#*2017年改正後、契約不適合責任にも適用される。
#[https://www.courts.go.jp/hanrei/52331/detail2/index.html 求償金請求事件](最高裁判決 平成15年03月14日)[[民法第145条]],[[民法第446条]],[[破産法第4条]],[[破産法第282条]]
#;破産終結決定がされて法人格が消滅した会社を主債務者とする保証人が主債務の消滅時効を援用することの可否
#:破産終結決定がされて法人格が消滅した会社を主債務者とする保証人は,主債務についての消滅時効が会社の法人格の消滅後に完成したことを主張してこれを援用することはできない。
#[https://www.courts.go.jp/hanrei/52324/detail2/index.html 補償金請求事件](最高裁判決 平成15年04月22日)[[特許法第35条]]
##'''職務発明について特許を受ける権利等を使用者等に承継させた従業者等が勤務規則その他の定めによる対価の額が特許法35条3項及び4項の規定に従って定められる相当の対価の額に満たないときに不足額を請求することの可否'''
##:使用者等があらかじめ定める勤務規則その他の定めにより職務発明について特許を受ける権利又は特許権を使用者等に承継させた従業者等は,当該勤務規則その他の定めに使用者等が従業者等に対して支払うべき対価に関する条項がある場合においても,これによる対価の額が特許法35条3項及び4項の規定に従って定められる相当の対価の額に満たないときは,同条3項の規定に基づき,その不足する額に相当する対価の支払を求めることができる。
##'''勤務規則その他の定めに対価の支払時期に関する条項がある場合における特許法35条3項の規定による相当の対価の支払を受ける権利の消滅時効の起算点'''
##:特許法35条3項の規定による相当の対価の支払を受ける権利の消滅時効は,使用者等があらかじめ定める勤務規則その他の定めに対価の支払時期に関する条項がある場合には,その支払時期から進行する。
#[https://www.courts.go.jp/hanrei/52297/detail2/index.html 保険金請求事件](最高裁判決 平成15年12月11日)[[商法第663条]],[[商法第683条]]1項,[[民法第91条]]
##'''生命保険契約において被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨を定めている保険約款の解釈'''
##生命保険契約に係る保険約款中の被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨の定めは,当時の客観的状況等に照らし,上記死亡の時からの保険金請求権の行使が現実に期待することができないような特段の事情が存する場合には,その権利行使が現実に期待することができるようになった時以降において上記消滅時効が進行する趣旨と解すべきである。
##'''生命保険契約に係る保険約款が被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨を定めている場合であっても上記消滅時効は被保険者の遺体が発見されるまでの間は進行しないとされた事例'''
##:生命保険契約に係る保険約款が被保険者の死亡の日の翌日を死亡保険金請求権の消滅時効の起算点とする旨を定めている場合であっても,被保険者が自動車を運転して外出したまま帰宅せず,その行方,消息については何の手掛かりもなく,その生死も不明であったが,行方不明になってから3年以上経過してから,峠の展望台の下方約120mの雑木林の中で,自動車と共に白骨化した遺体となって発見されたなど判示の事実関係の下では,上記消滅時効は,被保険者の遺体が発見されるまでの間は進行しない。
#[https://www.courts.go.jp/hanrei/34552/detail2/index.html 預金払戻請求事件](最高裁判決 平成19年04月24日)[[民法第91条]],[[民法第666条]]
#;いわゆる自動継続特約付きの定期預金契約における預金払戻請求権の消滅時効の起算点
#:いわゆる自動継続特約付きの定期預金契約における預金払戻請求権の消滅時効は,それ以降自動継続の取扱いがされることのなくなった満期日が到来した時から進行する。
#[https://www.courts.go.jp/hanrei/35631/detail2/index.html 損害賠償請求事件](最高裁判決 平成20年01月28日)商法522条,商法(平成17年法律第87号による改正前のもの)254条3項,商法(平成17年法律第87号による改正前のもの)254条ノ3,商法(平成17年法律第87号による改正前のもの)266条1項5号,'''[[会社法第423条]]第1項,[[会社法第430条]]'''
#;商法266条1項5号に基づく会社の取締役に対する損害賠償請求権の消滅時効期間
#:商法266条1項5号に基づく会社の取締役に対する損害賠償請求権の消滅時効期間は,民法167条1項により10年と解すべきである。
#[https://www.courts.go.jp/hanrei/37212/detail2/index.html 不当利得返還等請求事件](最高裁判決 平成21年01月22日)[[民法第703条]],[[利息制限法第1条]]1項
#;継続的な金銭消費貸借取引に関する基本契約が,利息制限法所定の制限を超える利息の弁済により発生した過払金をその後に発生する新たな借入金債務に充当する旨の合意を含む場合における,上記取引により生じた過払金返還請求権の消滅時効の起算点
#:継続的な金銭消費貸借取引に関する基本契約が,借入金債務につき利息制限法1条1項所定の制限を超える利息の弁済により過払金が発生したときには,弁済当時他の借入金債務が存在しなければ上記過払金をその後に発生する新たな借入金債務に充当する旨の合意を含む場合は,上記取引により生じた過払金返還請求権の消滅時効は,特段の事情がない限り,上記取引が終了した時から進行する。
#[https://www.courts.go.jp/hanrei/87485/detail2/index.html 建物根抵当権設定仮登記抹消登記手続請求事件](最高裁判決 平成30年2月23日)[[民法第396条]],[[破産法第253条]]1項本文
#;抵当権の被担保債権が免責許可の決定の効力を受ける場合における当該抵当権自体の消滅時効
#:抵当権の被担保債権が免責許可の決定の効力を受ける場合には,民法396条は適用されず,債務者及び抵当権設定者に対する関係においても,当該抵当権自体が,同法167条2項所定の20年の消滅時効にかかる。
----
{{前後
|[[コンメンタール民法|民法]]
|[[第1編 総則 (コンメンタール民法)|第1編 総則]]<br>
[[第1編 総則 (コンメンタール民法)#7|第7章 時効]]<br>
[[第1編 総則 (コンメンタール民法)#7-3|第3節 消滅時効]]
|[[民法第165条]]<br>(占有の中止等による取得時効の中断)
|[[民法第167条]]<br>(人の生命又は身体の侵害による損害賠償請求権の消滅時効)
}}
{{stub|law}}
[[category:民法|166]]
[[category:民法 2017年改正|166]]
an50c5w87k93ro1wa9lhx5ef4vj1zi0
法学入門
0
5850
304731
291779
2026-10-15T11:14:52Z
Kyube
57
wikify
304731
wikitext
text/x-wiki
*[[法学]] > [[法学入門]]
「法学入門」とは、大学法学部、他学部や短大の一般教育科目として、また専修学校や高校の一般知識教科として設けられているもの。科目名または教科名は、「法学入門」とは限らず、教科名では、「理工系学生のための法学概論」、文科省検定済商業科高校教科書などで「経済活動と法」というものもある。いずれにしても、大学法学部以外では、現行法の解説が主な内容となっている。
{{Wikiversity|法学入門|Topic:法学入門|トピック}}
=== 法学一般 ===
大正時代から第二次世界大戦後にかけて活躍した学者による書物
*『法学入門』([[w:末弘嚴太郎|末弘嚴太郎]] 日本評論社)
主に昭和期にかけて活躍した学者による書物
*『法学の基礎』([[w:団藤重光|団藤重光]] 有斐閣)
*『法学入門』([[w:三ヶ月章|三ヶ月章]] 弘文堂)
*『実定法学入門』([[w:田中英夫 (法学者)|田中英夫]] 東京大学出版会)
*『法学入門』([[w:星野英一|星野英一]] 有斐閣)
*『現代法学入門』([[w:伊藤正己|伊藤正己]]・[[w:加藤一郎 (法学者)|加藤一郎]] 有斐閣)
現代の学者による書物
*『法学の誕生』([[w:内田貴|内田貴]] 筑摩書房)
=== 基本七法 ===
主に昭和期にかけて活躍した学者による書物で昭和40年代頃の議論を知る参考になるもの。
==== 憲法 ====
*『憲法要論』([[w:清宮四郎|清宮四郎]] 法文社)
==== 民法 ====
*『民法大意 上・中・下』([[w:我妻栄|我妻栄]] 岩波書店)
*『民法大要(身分法)』([[w:中川善之助|中川善之助]] 勁草書房)
*『民法概論I - IV』([[w:星野英一|星野英一]] 良書普及会)
==== 刑法 ====
*『刑法総論』・『(同)各論』([[w:佐伯千仭|佐伯千仭]] 有信堂)
*『刑法』([[w:団藤重光|団藤重光]] 弘文堂)
==== 商法 ====
*『概説商法』([[w:石井照久|石井照久]] 勁草書房)
==== 民事訴訟法 ====
*『民事訴訟法(一)』([[w:兼子一|兼子一]] 有斐閣)
*『民事訴訟法』([[w:三ヶ月章|三ヶ月章]] 有斐閣)
==== 刑事訴訟法 ====
*『刑事訴訟法概論』([[w:小野清一郎|小野清一郎]] 法文社)
*『刑事訴訟法』([[w:平野龍一|平野龍一]] 有斐閣)
==== 行政法 ====
*『行政法』([[w:田中二郎|田中二郎]] 弘文堂)
*『行政法講義』([[w:柳瀬良幹|柳瀬良幹]] 良書普及会)
=== 論文集・その他理論書 ===
*『法律学における学説』([[w:宮沢俊義|宮沢俊義]] 有斐閣)
*『岩波講座 基本法学(全8巻)』(岩波書店)
*『比較不能な価値の迷路』([[w:長谷部恭男|長谷部恭男]] 東京大学出版会)
*『民法総論』([[w:大村敦志|大村敦志]] 岩波書店)
*『生活民法入門』(大村敦志 東京大学出版会)
2000年以降の本
=== 生活法学一般 ===
『大学生が知っておきたい生活のなかの法律』が慶應義塾大学出版会より2016年4月に刊行されている。
ISBN 978-4766423204
== 脚注 ==
<references/>
{{stub|law}}
[[Category:法学|にゆうもん]]
sp3whtcagmrzy67fee1jwglxbjmp0qj
Lojban For Beginners 日本語訳
0
14243
304727
156589
2026-10-15T09:13:51Z
Kyube
57
章構成が同一と思われる後継サイトに差し替え
304727
wikitext
text/x-wiki
{{Pathnav|メインページ|語学|ロジバン|ロジバンについての英語資料の日本語訳|frame=1}}
[https://www.opoudjis.net/lojbanbrochure/lessons/book1.html Lojban For Beginners — velcli befi la lojban. bei loi co'a cilre]
リンク先の本文で説明してある単語を併記してあります。
bridi を「文」と説明している箇所がありますが正しくは「命題」ですので注意してください。
== 内容 ==
# [[/前置き/]]
# '''[[/ 第1章 音、名前、および幾つかの心情表現/]]'''
#* [[/母音/]]
#* [[/子音/]]
#* [[/特殊文字/]]
#** ' . ,
#* [[/使用文字/]]
#** y bu
#* [[/「正しい」発音/]]
#* [[/ロジバンで気持ちを表そう/]]
#* [[/ロジバンの名称語(cmene)/]]
#** cmene
#* [[/ロジバンの単語を名称語として使う/]]
#* [[/練習問題の答え1/]]
# '''[[/第2章 関係性と語順/]]'''
#* [[/物事の名称と関係性/]]
#** selbri
#* [[/sumti/]]
#** sumti bridi
#* [[/sumti構造の決まり方/]]
#* [[/gismuをsumtiとして使う/]]
#** la le cu mi do tanru
#* [[/場所の変更/]]
#** zo'e fa fe fi fo fu
#* [[/2のまとめ/]]
#* [[/練習問題の答え2/]]
# '''[[/第3章 命令文、疑問文、所有格/]]'''
#* [[/命令文/]]
#** ko
#* [[/丁寧なお願い/]]
#** .e'o
#* [[/疑問文/]]
#** xu go'i na ma mo
#* [[/所有格/]]
#** pe
#* [[/続・所有格/]]
#** po po'e
#* [[/3のまとめ/]]
#* [[/練習問題の答え3/]]
# '''[[/第4章 数、冠詞/]]'''
#* [[/基本の数/]]
#** ki'o pi li
#* [[/数と冠詞/]]
#** lo lu'o lu'a lei loi
#* [[/割合/]]
#** fi'u pi
#* [[/量的表現/]]
#** du'e mo'a rau su'e su'o no ro so'a so'e so'i so'o so'u
#* [[/数量を尋ねる/]]
#** xo
#* [[/4のまとめ/]]
#** la le lo li lu la'e le'e lo'e lai lei loi la'i le'i lo'i
#* [[/練習問題の答え4/]]
# '''[[/第5章 時間、日、日付(および抽象表現)/]]'''
#* [[/時間とは?/]]
#** ti pi'e ni'u cac.
#* [[/時と出来事/]]
#** nu ka ni
#* [[/続・時と出来事: 転換/]]
#** se te ve xe
#* [[/続々・時と出来事: sumti tcita/]]
#** ti'u
#* [[/月日、曜日の表現/]]
#** djed. mast.
#* [[/日付/]]
#** kei de'u
#* [[/5のまとめ/]]
#* [[/練習問題の答え5/]]
# '''[[/第6章 時間・空間 - ロジバンの基本的な「時制」/]]'''
#* [[/終端子/]]
#** ku boi vau kei
#* [[/時制/]]
#* [[/時制 + sumti/]]
#** ba pu ca zi za zu
#* [[/時制 + selbri/]]
#** zi za zu ze'i ze'a ze'u
#* [[/空間/]]
#** vi va vu bu'u ri'u fa'a to'o zu'a ne'a ne'i
#* [[/様々な否定形/]]
#** na na'e to'e no'e
#* [[/6のまとめ/]]
#* [[/練習問題の答え6/]]
# '''[[/第7章 代名詞と抽象表現をさらに/]]'''
#* [[/前に言った「それ、彼女、彼」を指す/]]
#** go'i ri ra ru da de di
#* [[/代名詞の割り当て/]]
#** goi ko'a ko'e ko'i ko'o ko'u mo'i ne'i ti'a
#* [[/頭文字/]]
#** fo'a fo'e fo'i fo'o fo'u
#* [[/直接引用する言い方/]]
#** lu li'u lo'u le'u
#* [[/直接引用はしない言い方/]]
#** nu sedu'u du'u su'u
#* [[/代名詞をもう少し/]]
#** mi'o mi'a ma'a mi
#* [[/7のまとめ/]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
# '''[[/第8章 ひっくり返す・合成語を作る/]]'''
#* [[/用言( selbri )の転換/]]
#* [[/体言( sumti )の転換/]]
#* [[/合成語( lujvo )/]]
#** sel ter vel xel
#* [[/否定の合成語( lujvo )/]]
#** nal nar tol nor
#* [[/再帰代名詞・相互関係/]]
#*:vo'a vo'e vo'i soi
#* [[/8のまとめ/]]
# '''[[/第9章 説明を加えます。体言( sumti )の内部情報/]]'''
#* [[/内部の体言( sumti )/]]
#** be
#* [[/内部の体言( sumti )をもう少し/]]
#** bei be'o
#* [[/内部の前置詞( sumti tcita )/]]
#* [[/内部の文( bridi )(関係節)/]]→訂正: 内部の文( bridi を使う)(関係節)
#** poi ku'o
#* [[/ke'a/]]
#** ke'a
#* [[/限定する・付加する/]]
#** noi ne
#* [[/9のまとめ/]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
# '''[[/第10章 原因と結果/]]'''
#* [[/物理的な原因/]]
#** rinka ri'a
#* [[/動機/]]
#** mukti mu'i
#* [[/正当的な理由・論理的にもたらすもの/]]
#** krinu ki'u nibli
#* [[/ひっくり返す/]]
#** ni'i seni'i
#* [[/文をつなげる/]]
#*:.e .ije bo
#* [[/なぜ?/]]
#** ma
#* [[/10のまとめ/]]
# '''[[/第11章 ロジバン接続詞/]]'''
#* [[/論理的な接続詞/]]
#* [[/体言( sumti )をつなげる/]]
#** .e joi .a .anai .o .onai .u
#* [[/修飾( tanru )の語をつなげる/]]
#** tanru je ja jonai ju
#* [[/用言( selbri )をつなげる/]] →訂正: 述語をつなげる
#** gi'e
#* [[/接続詞を尋ねる/]]
#** ji je'i gi'i na nai
#* [[/11のまとめ/]]
# '''[[/第12章 時間の相・呼応系(呼びかけ)・借用語・同一であること/]]'''
#* [[/時間の相/]]
#* [[/相をもう少し/]]
#* [[/呼応系(呼びかけ)/]]
#* [[/借用語/]]
#* [[/同一であること/]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
# '''[[/第13章 表現の仕方について/]]'''
#* [[/心態詞/]]
#* [[/心態詞は私のもの。あなたについては?/]]
#* [[/談話系/]]
#* [[/取り消す/]]
#* [[/その他/]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
# '''[[/第14章 接続詞をもう少し/]]'''
#* [[/先行する接続詞/]]
#* [[/非論理的な接続詞/]]
#* [[/つなげてまとめる/]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
# '''[[/第15章 間接疑問文・性質・ぼかす言い方/]]'''
#* [[/間接疑問文/]]
#* [[/性質/]]
#* [[/ぼかす言い方/]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
#* [[Lojban For Beginners |Lojban For Beginners ]]
[[Category:ロジバン]]
38tqpgk0qudnlnz5hg01w2dk52wnviy
平家物語 祇園精舎
0
17362
304725
303726
2026-10-15T03:10:42Z
~2026-55228-10
92796
/* 本文の読み方 */ 誤字修正
304725
wikitext
text/x-wiki
[[文学]]>[[古典文学]]>[[日本の古典]]>[[平家物語]]
[[Category:平家物語|きおんしようしや]]
==本文==
[[w:祇園精舍|祇園精舍]]の鐘の声、[[w:諸行無常|諸行無常]]の響きあり。[[w:サラソウジュ|娑羅双樹]]の花の色、盛者必衰の理をあらはす。驕れる人も久しからず、ただ春の夜の夢のごとし。猛き者もつひにはほろびぬ、ひとへに風の前の塵に同じ。
遠く[[w:中国の歴史|異朝]]をとぶらへば、[[w:秦|秦]]の[[w:趙高|趙高]]、[[w:漢|漢]]の[[w:王莽|王莽]]、[[w:梁 (南朝)|梁]]の[[w:朱イ|朱异]]、[[w:唐|唐]]の[[w:安禄山|祿山]]、これらは皆[[w:君主|舊主]][[w:皇帝|先皇]]の[[w:政治|政]]にもしたがはず、樂しみをきはめ、諌めをも思ひ入れず、[[w:天下|天下]]の亂れん事を悟らずして、[[w:民間|民間]]の愁ふるところを知らざつしかば、久しからずして、亡じにし者どもなり。
近く[[w:日本の歴史|本朝]]をうかがふに、[[w:承平 (日本)|承平]]の[[w:平将門|將門]]、[[w:天慶|天慶]]の[[w:藤原純友|純友]]、[[w:康和|康和]]の[[w:源義親|義親]]、[[w:平治|平治]]の[[w:藤原信頼|信賴]]、これらはおごれる心もたけき事も、皆とりどりにこそありしかども、まぢかくは[[w:六波羅|六波羅]]の[[w:入道|入道]]、[[w:太政大臣|前太政大臣]][[w:平清盛|平朝臣清盛公]]と申しし人のありさま、傳へ承るこそ、心もことばも及ばれね。
その[[w:先祖|先祖]]を尋ぬれば[[w:桓武天皇|桓武天皇]]第五の皇子、[[w:一品|一品]][[w:式部省|式部卿]][[w:葛原親王|葛原親王]]九代の後胤、[[w:讃岐|讃岐守]][[w:平正盛|正盛]]が孫、[[w:刑部省|刑部卿]][[w:平忠盛|忠盛]]朝臣の[[w:嫡男|嫡男]]なり。かの[[w:親王|親王]]の[[w:王 (皇族)|御子]]、[[w:高見王|高見王]]、無官無位にして失せ給ひぬ。その御子、[[w:高望王|高望王]]の時、初めて平の姓を賜はつて、[[w:上総|上総介]]に成り給ひしより、たちまちに王氏を出でて人臣に列なる、その子[[w:鎮守府将軍|鎮守府将軍]][[w:平国香|良望]]、後には[[w:平国香|國香]]と改む。國香より正盛に至る六代は、諸国の[[w:受領|受領]]たりしかども、[[w:昇殿|殿上]]の仙籍をば未だ赦されず。
----
==本文の読み方==
[[w:祇園精舎|ぎおんしょうじゃ]]のかねのこえ、[[w:諸行無常|しょぎょうむじょう]]のひびきあり。
[[w:サラソウジュ|しゃらそうじゅ]]のはなのいろ、
じょうしゃひっすいのことわりをあらわす。
おごれるひともひさしからず、
ただはるのよのゆめのごとし。
たけきものもついにはほろびぬ、
ひとえにかぜのまえのちりにおなじ。
とおく[[w:異朝|いちょう]]をとぶらえば、
しんのちょうこう、かんのおうもう、りょうのしゅうい、とうのろくさん、
これらはみな、きゅうしゅせんこうのまつりごとにもしたがわず、
たのしみをきわめ、いさめをもおもいいれず、
てんかのみだれんことをさとらずして、
みんかんのうれうるところをしらざつしかば、
ひさしからずしてぼうじにしものどもなり。
ちかくほんちょうをうかがうに、
じょうへいのまさかど、てんぎょうのすみとも、こうわのよしちか、へいじののぶより、
これらはおごれるこころも、たけきこともみなとりどりにこそありしかども、まぢかくは、
ろくはらのにゅうどう、さきのだいじょうだいじん、たいらのあそんきよもりこうともうししひとのありさま、
つたえうけたまわるこそ、こころもことばもおよばれね。
そのせんぞをたずぬればかんむてんのうだいごのおうじ、
いっぽんしきぶきょうかずらはらしんのうくだいのこういん、さぬきのかみまさもりがまご、
ぎょうぶきょうただもりのあそんのちゃくなんなり。
かのしんのうのみこ、たかみのおう、むかんむいにしてうせたまいぬ。
そのみこ、たかもちのおうのとき、はじめてへいのしょうをたまわって、
かずさのすけになりたまいしより、たちまちにおうしをいでてじんしんにつらなる。
そのこちんじゅふのしょうぐんよしもち、のちにはくにかとあらたむ。
くにかよりまさもりにいたるろくだいは、しょこくのずりょうたりしかども、
てんじょうのせんせきをばいまだゆるされず。
==現代語訳==
[[w:祇園精舍|祇園精舍]]の鐘の音には、[[w:諸行無常|諸行無常]]すなわちこの世のすべての現象は絶えず変化していくものだという響きがある。[[w:娑羅双樹|娑羅双樹]]の花の色は、どんなに勢いが盛んな者も必ず衰えるものであるという道理をあらわしている。世に栄え得意になっている者も、その栄えはずっとは続かず、春の夜の夢のようである。勢い盛んではげしい者も、結局は滅び去り、まるで風に吹き飛ばされる塵と同じようである。
遠い[[w:中国の歴史|外国]](の例)を見ると、[[w:秦|秦]]の[[w:趙高|趙高]]、[[w:漢|漢]]の[[w:王莽|王莽]]、[[w:梁 (南朝)|梁]]の[[w:朱イ|朱忌]]、[[w:唐|唐]]の[[w:安禄山|安禄山]]、これらはみな元の[[w:君主|君主]]や先代[[w:皇帝|皇帝]]の政治に従わず、(栄華の)楽しみを極め、忠告にも深く考えようとはせず、[[w:天下|天下]]が乱れることもわからずに、人々の苦労するところとなるものも知らなかったので、長続きせずに滅びた者たちである。
身近な[[w:日本の歴史|日本]](の例)を見ると、[[w:承平天慶の乱|承平]]の[[w:平将門|平将門]]、[[w:承平天慶の乱|天慶]]の[[w:藤原純友|藤原純友]]、[[w:康和|康和]]の[[w:源義親|源義親]]、[[w:平治の乱|平治]]の[[w:藤原信頼|藤原信頼]]、(これらの人は)得意になる心も猛々しい心も、みなそれぞれ持っていたが、最近では[[w:六波羅|六波羅]]の[[w:入道|入道]]、[[w:太政大臣|前太政大臣]][[w:平清盛|平朝臣清盛公]]と申した人の様子は伝え聞いても想像することも形容することもできない(ほどである)。
その清盛の[[w:先祖|先祖]]を調べると、[[w:桓武天皇|桓武天皇]]の第五皇子、一品式部卿葛原親王から数えて九代目の子孫、讃岐守正盛の孫で、刑部卿忠盛の嫡男である。葛原親王の御子、高見王は、官職も官位もないままなくなられた。その御子の高望王のとき、初めて平の姓を賜わって、上総介になられてから、ただちに皇籍を離れて臣下の列に連なる。その子・鎮守府将軍良望は、後には国香と名を改めた国香から正盛に至るまでの六代は、諸国の国守ではあったが、殿上人として昇殿することは、まだ許されなかった。
----
[[File:平家物語・祇園精舎サンプル3.png|thumb|left|祇園精舎 原文]]
[[File:平家物語・祇園精舎 現代語訳.png|thumb|none|祇園精舎 現代語訳]]
2vvbytul0xhan1yf03fk1gw9rp3w7tg
高等学校化学基礎/酸化還元反応
0
19280
304710
300457
2026-10-14T15:18:46Z
Nermer314
62933
304710
wikitext
text/x-wiki
{{pathnav|高等学校の学習|高等学校理科|高等学校化学|[[高等学校 化学基礎|化学基礎]]|pagename=酸化還元反応|frame=1|small=1}}
== 酸化と還元の定義 ==
銅 <chem>Cu</chem> の粉末を空気中で加熱すると、銅が空気中の酸素と結合して、酸化銅(II) <chem>CuO</chem> が得られる。
:<chem>2Cu + O2 -> 2CuO</chem>
このように、物質に酸素が化合することを'''酸化'''という。この反応では、銅が'''酸化されて'''酸化銅(II)になった。酸化によって生成した物質を'''酸化物'''という。このような酸化の反応を'''酸化反応'''という。
つぎに、この酸化銅(II)の粉末を耐熱ガラスなどに入れ、水素を通じながら加熱すると、粉末は赤褐色の銅に戻る。
これは、水素が酸化銅(II)から酸素を奪い、もとの銅に戻した変化である。
:<chem>CuO + H2 -> Cu + H2O</chem>
このように、ある物質が酸素を失うことを'''還元'''という。この反応では、酸化銅(II)が還元されて銅になった。このような還元の反応を'''還元反応'''という。この反応では、水素は酸化されて水になっている。このように、酸化反応と還元反応は同時に起こる。そこで、同時に起こる酸化反応と還元反応とをまとめて、'''酸化還元反応'''という。
酸化銅(II)は、銅(II)イオン <chem>Cu^2+</chem> と酸化物イオン <chem>O^2-</chem> からなる。還元されて銅になるとき、<chem>Cu^2+</chem> は電子を受け取って <chem>Cu</chem> になっている。このように、酸化と還元は、電子の授受で考えることができる。原子やイオンが電子を受け取ることを還元、電子を失うことを酸化と定義すると、酸素や水素が関係しない反応にも、酸化と還元の考え方を広げられる。このように、物質の酸化と還元を一般に判別するには、電子の授受で考える。
酸化と還元を、酸素・水素・電子の出入りでまとめると、次の表のようになる。
{| class="wikitable"
! !! 酸素 !! 水素 !! 電子
|-
! 酸化
| 得る(化合する) || 失う || 失う
|-
! 還元
| 失う || 得る || 得る
|}
=== 例 ===
マグネシウムを空気中で燃焼させると、酸化マグネシウムが生じる。
:<chem>2Mg + O2 -> 2MgO</chem>
(マグネシウムが酸化(酸素が化合)して、酸化マグネシウムになった)
この反応は、次の2つのイオン半反応式に分けて表すことができる。電子 <chem>e-</chem> を含む、このような式を'''半反応式'''という。
:<chem>2Mg -> 2Mg^2+ + 4e-</chem>
:<chem>O2 + 4e- -> 2O^2-</chem>
マグネシウムは電子を失っているので酸化されており、酸素は電子を得ているので還元されている。酸化還元反応の化学反応式は、半反応式をつくり、電子の数が等しくなるようにして足し合わせることで作る。
== 酸化数 ==
イオン結合では電子の授受の方向が判別しやすいが、共有結合からなる物質の反応では、電子の授受の方向が判別しにくい場合が多い。そこで、共有結合の場合にも酸化の度合いを定められるように、'''酸化数'''という概念が考えられた。酸化数は、次の規則で決める。
'''酸化数の決め方'''
* 単体の原子の酸化数は0とする。
(例)単体の水素 <chem>H2</chem>、酸素 <chem>O2</chem>、炭素 <chem>C</chem>、鉄 <chem>Fe</chem> の酸化数は、いずれも0である。
* 単原子イオンの酸化数は、イオンの価数(電荷)に等しい。
(例)<chem>Na+</chem> の酸化数は +1、<chem>Cl-</chem> の酸化数は -1、<chem>Al^3+</chem> の酸化数は +3 である。
* 化合物中の水素原子 <chem>H</chem> の酸化数は '''+1'''、酸素原子 <chem>O</chem> の酸化数は '''-2''' とする。ただし、過酸化水素 <chem>H2O2</chem> では <chem>O</chem> の酸化数は -1 とする。<br />
なお、水素化ナトリウム <chem>NaH</chem> のような金属の水素化物では、<chem>H</chem> の酸化数は -1 である。
* 化合物中のアルカリ金属原子の酸化数は +1、アルカリ土類金属原子の酸化数は +2 である。
* イオンではない化合物(電気的に中性な化合物)では、構成原子の酸化数の総和は0である。多原子イオンでは、構成原子の酸化数の総和は、イオンの価数に等しい。構成原子の酸化数が判断しにくい場合は、この規則を用いて、酸化数を決める。
(例)<chem>H2O</chem> では、水素原子の酸化数 +1 が2個と、酸素原子の酸化数 -2 が1個であるから、総和は <math>(+1) \times 2 + (-2) = 0</math> となり、確かに0である。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題1 酸化数の求め方'''
|-
|style="padding:5px"|
次の物質中の、指定した原子の酸化数を求めよ。(1) <chem>H2SO4</chem> の <chem>S</chem> (2) <chem>KMnO4</chem> の <chem>Mn</chem> (3) <chem>Cr2O7^2-</chem> の <chem>Cr</chem> (4) <chem>NH3</chem> の <chem>N</chem>
|}
{{解答|例題1の解答}}
求める酸化数を <math>x</math> とおく。
* (1) <chem>H2SO4</chem> は中性であるから、<math>(+1) \times 2 + x + (-2) \times 4 = 0</math> より、<math>x = +6</math>
* (2) <chem>KMnO4</chem> は中性で、<chem>K</chem> は +1 であるから、<math>(+1) + x + (-2) \times 4 = 0</math> より、<math>x = +7</math>
* (3) <chem>Cr2O7^2-</chem> は電荷が -2 であるから、<math>2x + (-2) \times 7 = -2</math> より、<math>x = +6</math>
* (4) <chem>NH3</chem> は中性であるから、<math>x + (+1) \times 3 = 0</math> より、<math>x = -3</math>
{{証明終わり}}
同じ元素でも、化合物によって酸化数はさまざまな値をとる。窒素と硫黄の例を、次の表に示す。
{| class="wikitable" style="text-align:center;"
! 窒素を含む物質
| <chem>NH3</chem> || <chem>N2</chem> || <chem>NO</chem> || <chem>NO2</chem> || <chem>HNO3</chem>
|-
! <chem>N</chem> の酸化数
| <math>-3</math> || <math>0</math> || <math>+2</math> || <math>+4</math> || <math>+5</math>
|-
! 硫黄を含む物質
| <chem>H2S</chem> || <chem>S</chem> || <chem>SO2</chem> || <chem>H2SO4</chem> || <chem>SO4^2-</chem>
|-
! <chem>S</chem> の酸化数
| <math>-2</math> || <math>0</math> || <math>+4</math> || <math>+6</math> || <math>+6</math>
|}
酸化数が中間の値をとる物質(<chem>SO2</chem> など)は、反応する相手によって、酸化剤にも還元剤にもなることがある。
=== 酸化数と酸化・還元 ===
酸化数を使うと、酸化還元を次のように判別できる。
{| class="wikitable"
! !! 酸化数 !! 電子
|-
! 酸化された
| 増加する || 失う
|-
! 還元された
| 減少する || 得る
|}
たとえば、<chem>CuO + H2 -> Cu + H2O</chem> では、<chem>Cu</chem> の酸化数が +2 から 0 に減少しているので、<chem>CuO</chem> は還元されたことがわかる。<chem>H</chem> の酸化数は 0 から +1 に増加しているので、<chem>H2</chem> は酸化されたことがわかる。
また、酸化数が変化しない反応は、酸化還元反応ではない。酸化還元反応では、酸化された原子の酸化数の増加の総和と、還元された原子の酸化数の減少の総和が等しい。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題2 酸化還元反応の判別'''
|-
|style="padding:5px"|
次の反応のうち、酸化還元反応であるものを選び、酸化された物質と還元された物質を答えよ。
:(1) <chem>2KI + Cl2 -> 2KCl + I2</chem>
:(2) <chem>H2SO4 + 2NaOH -> Na2SO4 + 2H2O</chem>
:(3) <chem>SO2 + 2H2S -> 3S + 2H2O</chem>
|}
{{解答|例題2の解答}}
* (1) <chem>I</chem> の酸化数が <math>-1</math> から <math>0</math> に増加し、<chem>Cl</chem> の酸化数が <math>0</math> から <math>-1</math> に減少している。酸化還元反応であり、<chem>KI</chem> が酸化され、<chem>Cl2</chem> が還元された。
* (2) すべての原子の酸化数が変化していない(<chem>H</chem> は <math>+1</math>、<chem>O</chem> は <math>-2</math>、<chem>S</chem> は <math>+6</math>、<chem>Na</chem> は <math>+1</math> のまま)。中和反応であり、酸化還元反応ではない。
* (3) <chem>SO2</chem> 中の <chem>S</chem> の酸化数が <math>+4</math> から <math>0</math> に減少し、<chem>H2S</chem> 中の <chem>S</chem> の酸化数が <math>-2</math> から <math>0</math> に増加している。酸化還元反応であり、<chem>H2S</chem> が酸化され、<chem>SO2</chem> が還元された。酸化数の増加の総和は <math>(+2) \times 2 = +4</math>、減少の総和は <math>-4</math> で、つりあっている。
{{証明終わり}}
== 酸化剤と還元剤 ==
酸化還元反応で、相手の物質から電子を奪って相手を酸化する物質を'''酸化剤'''という。また、相手の物質に電子を与えて相手を還元する物質を'''還元剤'''という。酸化剤自身は還元され、還元剤自身は酸化される。したがって、酸化剤は、含まれる原子の酸化数が減少する物質であり、還元剤は、含まれる原子の酸化数が増加する物質である。
主な酸化剤と還元剤と、その反応(半反応式)は、次の表のとおりである。
{| class="wikitable"
|+ 主な酸化剤
!物質
!化学式
!反応
|-
|過酸化水素
|<chem>H2O2</chem>
|<chem>H2O2 + 2H^+ + 2e- -> 2H2O</chem>
|-
|塩素
|<chem>Cl2</chem>
|<chem>Cl2 + 2e- -> 2Cl-</chem>
|-
|濃硝酸
|<chem>HNO3</chem>
|<chem>HNO3 + H^+ + e- -> NO2 + H2O</chem>
|-
|希硝酸
|<chem>HNO3</chem>
|<chem>HNO3 + 3H^+ + 3e- -> NO + 2H2O</chem>
|-
|熱濃硫酸(加熱した濃硫酸)
|<chem>H2SO4</chem>
|<chem>H2SO4 + 2H^+ + 2e- -> SO2 + 2H2O</chem>
|-
|過マンガン酸カリウム(酸性下で)
|<chem>KMnO4</chem>
|<chem>MnO4^- + 8H^+ + 5e- -> Mn^2+ + 4H2O</chem>
|-
|二クロム酸カリウム(酸性下で)
|<chem>K2Cr2O7</chem>
|<chem>Cr2O7^2- + 14H^+ + 6e- -> 2Cr^3+ + 7H2O</chem>
|-
|二酸化硫黄
|<chem>SO2</chem>
|<chem>SO2 + 4H^+ + 4e- -> S + 2H2O</chem>
|}
{| class="wikitable"
|+ 主な還元剤
!物質
!化学式
!反応
|-
|水素
|<chem>H2</chem>
|<chem>H2 -> 2H^+ + 2e-</chem>
|-
|過酸化水素
|<chem>H2O2</chem>
|<chem>H2O2 -> O2 + 2H^+ + 2e-</chem>
|-
|スズ(II)イオン
|<chem>Sn^2+</chem>
|<chem>Sn^2+ -> Sn^4+ + 2e-</chem>
|-
|鉄(II)イオン
|<chem>Fe^2+</chem>
|<chem>Fe^2+ -> Fe^3+ + e-</chem>
|-
|二酸化硫黄
|<chem>SO2</chem>
|<chem>SO2 + 2H2O -> SO4^2- + 4H^+ + 2e-</chem>
|-
|硫化水素
|<chem>H2S</chem>
|<chem>H2S -> S + 2H^+ + 2e-</chem>
|-
|蓚酸
|<chem>H2C2O4</chem><br>(<chem>(COOH)2</chem>とも)
|<chem>H2C2O4 -> 2CO2 + 2H^+ + 2e-</chem>
|}
過酸化水素 <chem>H2O2</chem> と二酸化硫黄 <chem>SO2</chem> は、相手によって酸化剤にも還元剤にもなる。たとえば、<chem>H2O2</chem> は、過マンガン酸カリウムのような強い酸化剤に対しては還元剤としてはたらき、<chem>KI</chem> のような還元剤に対しては酸化剤としてはたらく。なお、過酸化水素が酸化剤としてはたらく反応は、塩基性の水溶液中では <chem>H2O2 + 2e- -> 2OH-</chem> と表される。
これらの酸化剤・還元剤とその反応は、覚えておくとよい。このとき、酸化剤・還元剤が還元・酸化される前後の物質だけを覚えておけば、反応式を導くことができる。
たとえば、二クロム酸イオンが還元される反応は、<chem>Cr2O7^2- -> Cr^3+</chem> と変化することさえ覚えておけば、次のように、両辺で原子の個数と電荷の和が等しいことから、反応式が導ける。
# <chem>Cr</chem> の個数をそろえる <chem>Cr2O7^2- -> 2Cr^3+</chem>
# <chem>H2O</chem> と <chem>H^+</chem> を、原子の数が一致するように加える <chem>Cr2O7^2- + 14H^+ -> 2Cr^3+ + 7H2O</chem>
# <chem>e-</chem> を、電荷の和が一致するように加える <chem>Cr2O7^2- + 14H^+ + 6e- -> 2Cr^3+ + 7H2O</chem>
=== 酸化還元反応式のつくり方 ===
酸化剤の半反応式と還元剤の半反応式を、電子の数が等しくなるように何倍かして足し合わせると、電子 <chem>e-</chem> が消去され、酸化還元反応のイオン反応式が得られる。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題3 過マンガン酸カリウムと過酸化水素'''
|-
|style="padding:5px"|
硫酸酸性の過マンガン酸カリウム水溶液に、過酸化水素水を加えると、過マンガン酸イオンが還元されて <chem>Mn^2+</chem> になり、酸素が発生する。この反応のイオン反応式と化学反応式を書け。
|}
{{解答|例題3の解答}}
酸化剤 <chem>MnO4^-</chem> と還元剤 <chem>H2O2</chem> の半反応式は、それぞれ次のとおりである。
:<chem>MnO4^- + 8H^+ + 5e- -> Mn^2+ + 4H2O</chem> ・・・(1)
:<chem>H2O2 -> O2 + 2H^+ + 2e-</chem> ・・・(2)
電子の数を10個にそろえるため、(1)を2倍、(2)を5倍して足し合わせる。
:<chem>2MnO4^- + 5H2O2 + 6H^+ -> 2Mn^2+ + 5O2 + 8H2O</chem>
これがイオン反応式である。両辺に <chem>2K+</chem> と <chem>3SO4^2-</chem> を加えると、化学反応式が得られる。
:<chem>2KMnO4 + 5H2O2 + 3H2SO4 -> 2MnSO4 + 5O2 + K2SO4 + 8H2O</chem>
{{証明終わり}}
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題4 ヨウ化カリウムと過酸化水素'''
|-
|style="padding:5px"|
硫酸酸性のヨウ化カリウム水溶液に過酸化水素水を加えると、ヨウ素 <chem>I2</chem> が生じて、溶液が褐色になる。この反応のイオン反応式を書け。
|}
{{解答|例題4の解答}}
過酸化水素は酸化剤、ヨウ化物イオンは還元剤としてはたらく。それぞれの半反応式は、次のとおりである。
:<chem>H2O2 + 2H^+ + 2e- -> 2H2O</chem> ・・・(1)
:<chem>2I^- -> I2 + 2e-</chem> ・・・(2)
電子の数がどちらも2個でそろっているので、(1)と(2)をそのまま足し合わせる。
:<chem>H2O2 + 2I^- + 2H^+ -> I2 + 2H2O</chem>
この反応で、<chem>H2O2</chem> は酸化剤としてはたらいている。過マンガン酸カリウムとの反応(前の例題)では還元剤としてはたらいていたことと比べると、過酸化水素が相手によって酸化剤にも還元剤にもなることがわかる。
{{証明終わり}}
=== 酸化還元滴定 ===
酸化剤と還元剤が過不足なく反応するとき、
:<math>\text{酸化剤が受け取る電子の物質量} = \text{還元剤が失う電子の物質量}</math>
が成り立つ。この関係を利用して、濃度のわかっている酸化剤(または還元剤)の水溶液から、濃度のわからない還元剤(または酸化剤)の水溶液の濃度を求める操作を'''酸化還元滴定'''という。
過マンガン酸カリウムを用いる滴定では、指示薬を加える必要がない。<chem>MnO4^-</chem> は赤紫色であるが、硫酸酸性の溶液中で還元されて生じる <chem>Mn^2+</chem> はほとんど無色である。そのため、還元剤の溶液に過マンガン酸カリウム水溶液を滴下していくと、還元剤が残っている間は赤紫色がすぐに消える。還元剤がすべて反応すると、赤紫色が消えずに残るので、この点を終点とする。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題5 酸化還元滴定'''
|-
|style="padding:5px"|
0.0500 mol/L のシュウ酸 <chem>H2C2O4</chem> 水溶液 10.0 mL に希硫酸を加えて温め、濃度のわからない過マンガン酸カリウム水溶液で滴定したところ、8.00 mL を加えたところで、赤紫色が消えなくなった。過マンガン酸カリウム水溶液のモル濃度を求めよ。
|}
{{解答|例題5の解答}}
半反応式は、次のとおりである。
:<chem>MnO4^- + 8H^+ + 5e- -> Mn^2+ + 4H2O</chem>
:<chem>H2C2O4 -> 2CO2 + 2H^+ + 2e-</chem>
<chem>MnO4^-</chem> 1 mol は電子を 5 mol 受け取り、<chem>H2C2O4</chem> 1 mol は電子を 2 mol 失う。過マンガン酸カリウム水溶液のモル濃度を <math>x</math> [mol/L] とすると、受け取る電子と失う電子の物質量が等しいことから、
:<math>5 \times x \times \dfrac{8.00}{1000} = 2 \times 0.0500 \times \dfrac{10.0}{1000}</math>
:<math>x = 2.50 \times 10^{-2}\ \mathrm{mol/L}</math>
となる。なお、2つの半反応式から電子を消去すると、<chem>2MnO4^- + 5H2C2O4 + 6H^+ -> 2Mn^2+ + 10CO2 + 8H2O</chem> となり、<chem>MnO4^-</chem> と <chem>H2C2O4</chem> は物質量の比 2:5 で反応することがわかる。
{{証明終わり}}
== 金属と酸化還元反応 ==
=== イオン化傾向 ===
金属元素の単体が、溶液中で陽イオンになろうとする性質を'''イオン化傾向'''という。陽イオンになりやすい金属ほど、イオン化傾向が大きい。
例として、亜鉛 <chem>Zn</chem> を希塩酸 <chem>HCl</chem> の水溶液に入れると、亜鉛は電子を失って <chem>Zn^2+</chem> になって溶け、水素が発生する。
:<chem>Zn + 2H^+ -> Zn^2+ + H2</chem>
一方、銀 <chem>Ag</chem> を希塩酸に入れても、反応は起こらない。
このように、金属のイオン化傾向の大きさは、金属ごとに異なる。
銅を希塩酸に入れた場合も、何も反応しない。以上の例では、銅と銀のイオン化傾向の大小は、わからない。
=== 銅と銀のイオン化傾向 ===
;硝酸銀溶液と銅の場合
銅と銀のイオン化傾向を比べるために、硝酸銀 <chem>AgNO3</chem> の水溶液に、銅線や銅板を入れる。ここでは、銅板を入れたとする。すると、銅板の表面に銀が析出する。一方、銅は陽イオンとなって溶け出し、溶液はしだいに青くなる。この青色は、銅(II)イオンの色である。
この変化を反応式で書くと、
:<chem>Cu + 2Ag^+ -> Cu^2+ + 2Ag</chem>
となる。なお、この反応では、析出した銀が樹木が枝を伸ばすように成長することがあり、これを'''銀樹'''という。
;硫酸銅溶液と銀の場合
一方、硫酸銅(II) <chem>CuSO4</chem> の水溶液に銀板 <chem>Ag</chem> を入れても、何も析出せず、変化は起きない。
これらのことから、銅は銀よりもイオン化傾向が大きいことがわかる。
=== 亜鉛と銅のイオン化傾向 ===
また、硫酸銅(II)の水溶液に亜鉛板 <chem>Zn</chem> を入れると、亜鉛の表面に銅が析出する。
:<chem>Zn + Cu^2+ -> Zn^2+ + Cu</chem>
このことから、亜鉛 <chem>Zn</chem> は銅 <chem>Cu</chem> よりもイオン化傾向が大きいことがわかる。
=== イオン化列 ===
さまざまな水溶液と金属の組み合わせで、イオン化傾向の比較の実験を行った結果、イオン化傾向の大きさの順序が決定された。
左から順に、イオン化傾向の大きい金属を並べると、次のようになる。
:<chem>Li</chem> > <chem>K</chem> > <chem>Ca</chem> > <chem>Na</chem> > <chem>Mg</chem> > <chem>Al</chem> > <chem>Zn</chem> > <chem>Fe</chem> > <chem>Ni</chem> > <chem>Sn</chem> > <chem>Pb</chem> > (<chem>H2</chem>) > <chem>Cu</chem> > <chem>Hg</chem> > <chem>Ag</chem> > <chem>Pt</chem> > <chem>Au</chem>
金属を、イオン化傾向の大きさの順に並べたものを、金属の'''イオン化列'''という。
水素は金属ではないが、比較のために、イオン化列に加えられる。
金属元素は、上記のほかにもあるが、高校化学では、上記の金属のイオン化列を用いることが多い。
イオン化列を記憶するための語呂合わせとして、
「リッチに貸そうかな、まあ、あてにすな、ひどすぎる借金。」
などがある。ちなみに、この語呂合わせは、
「Liリッチに Kか そう かCa なNa、まMg あAl、あZn てFe にNi すSn なPb、ひH2 どCu すHg ぎAg る 借金Pt,Au。」
と対応している。
=== 水との反応 ===
イオン化傾向の大きい金属ほど、水と反応しやすい。
{| class="wikitable"
|+ 金属と水の反応
! 金属 !! 水との反応
|-
| <chem>Li, K, Ca, Na</chem> || 常温の水と反応して、水素を発生し、水酸化物になる。
|-
| <chem>Mg</chem> || 熱水と反応して、水素を発生する。
|-
| <chem>Al, Zn, Fe</chem> || 高温の水蒸気と反応する。
|-
| <chem>Ni</chem> 以下のもの || 水とは、ふつう反応しない。
|}
例として、ナトリウムは常温の水と激しく反応する。
:<chem>2Na + 2H2O -> 2NaOH + H2</chem>
マグネシウムは、常温の水とはほとんど反応しないが、熱水とは反応して水素を発生する。
:<chem>Mg + 2H2O -> Mg(OH)2 + H2</chem>
鉄は、高温の水蒸気と反応して、四酸化三鉄と水素を生じる。
:<chem>3Fe + 4H2O -> Fe3O4 + 4H2</chem>
=== 酸との反応 ===
* <chem>Li</chem>~<chem>Pb</chem> と酸
水素よりイオン化傾向が大きい金属は、希塩酸や希硫酸などの酸と反応し、水素を発生する。<chem>K</chem> や <chem>Ca</chem> などは、溶媒の水そのものとも激しく反応するので、ここでは考察の対象から外す。
:<chem>Mg + 2HCl -> MgCl2 + H2</chem>
:<chem>2Al + 6HCl -> 2AlCl3 + 3H2</chem>
:<chem>Zn + 2HCl -> ZnCl2 + H2</chem>
:<chem>Fe + H2SO4 -> FeSO4 + H2</chem>
* <chem>Pb</chem> と酸
<chem>Pb</chem> は、希塩酸や希硫酸とは、表面に水に溶けにくい塩化鉛(II) <chem>PbCl2</chem> や硫酸鉛(II) <chem>PbSO4</chem> ができるため、反応がほとんど進まない。
* <chem>Cu, Hg, Ag</chem> と酸
<chem>Cu, Hg, Ag</chem> は、塩酸や希硫酸には溶けない。これらを溶かすには、硝酸 <chem>HNO3</chem> や、熱濃硫酸のように、酸化力の強い酸が必要である。
:<chem>3Cu + 8HNO3 -> 3Cu(NO3)2 + 2NO + 4H2O</chem>(希硝酸)
:<chem>Cu + 4HNO3 -> Cu(NO3)2 + 2NO2 + 2H2O</chem>(濃硝酸)
:<chem>Cu + 2H2SO4 -> CuSO4 + SO2 + 2H2O</chem>(熱濃硫酸)
* <chem>Pt, Au</chem> と酸
<chem>Pt, Au</chem> は、硝酸や熱濃硫酸にも溶けない。これらを溶かすのは、'''王水'''である。王水は、濃塩酸と濃硝酸を、体積比3:1で混合した液である。
* 不動態
<chem>Al, Fe, Ni</chem> などは、濃硝酸に入れると、表面に緻密な酸化物の被膜ができるため、反応が進まない。このような金属の状態を'''不動態'''という。
== 酸化還元反応の利用 ==
=== 電池 ===
* 化学基礎では、電池の基本的な構造と各種電池の名称のみを取り扱う。そのため、詳しい解説は[[高校化学 電池と電気分解|電池と電気分解]]を参照すること。
酸化還元反応で放出される化学エネルギーを、電気エネルギーとして取り出す装置を'''電池'''という。イオン化傾向の異なる2種類の金属を電解質の水溶液に入れて導線でつなぐと、イオン化傾向の大きいほうの金属が電子を放出して陽イオンとなり、電子は導線を通って、もう一方の金属へ流れる。導線へ電子が流れ出す電極を'''負極'''、導線から電子が流れ込む電極を'''正極'''という。負極では酸化反応が、正極では還元反応が起こる。
たとえば、亜鉛板を硫酸亜鉛水溶液に、銅板を硫酸銅(II)水溶液に浸し、2つの水溶液を素焼き板などで仕切った電池を'''ダニエル電池'''という。この電池では、イオン化傾向の大きい亜鉛が負極、銅が正極となり、次の反応が起こる。
:負極: <chem>Zn -> Zn^2+ + 2e-</chem>(酸化)
:正極: <chem>Cu^2+ + 2e- -> Cu</chem>(還元)
全体としては、「亜鉛と銅のイオン化傾向」の節で述べた反応 <chem>Zn + Cu^2+ -> Zn^2+ + Cu</chem> と同じ反応が起こっている。
身のまわりでは、マンガン乾電池、アルカリマンガン乾電池などの一次電池(充電できない電池)や、鉛蓄電池、リチウムイオン電池などの二次電池(充電してくり返し使える電池)が用いられている。
=== 金属の精錬 ===
* 酸化物や硫化物から金属の単体を取り出すことを'''精錬'''という。これも、化学基礎では鉄しか反応式まで扱わないので、詳しい解説は[[高校化学 電池と電気分解|電池と電気分解]]を参照すること。
==== 鉄の精錬 ====
* 鉄は、鉄の酸化物を多く含む鉱石(赤鉄鉱 <chem>Fe2O3</chem> や磁鉄鉱 <chem>Fe3O4</chem> など)を、コークス(炭素)を用いて還元して得られる。<br />
鉄鉱石、コークス、石灰石を'''溶鉱炉'''(高炉)に入れ、下から熱風を送ると、コークスの燃焼で生じた一酸化炭素 <chem>CO</chem> が鉄の酸化物を還元する。赤鉄鉱の場合、反応は次のように表される。
:<chem>Fe2O3 + 3CO -> 2Fe + 3CO2</chem>
この反応で、<chem>Fe</chem> の酸化数は +3 から 0 に減少しており、<chem>Fe2O3</chem> は還元されている。一方、<chem>C</chem> の酸化数は +2(<chem>CO</chem> 中)から +4(<chem>CO2</chem> 中)に増加しており、<chem>CO</chem> は酸化されている。溶鉱炉から得られる鉄を'''銑鉄'''といい、炭素を約4%含み、硬いがもろい。銑鉄を転炉に入れて酸素を吹き込み、炭素を減らすと、強くて粘り強い'''鋼'''になる。
==== アルミニウムと銅 ====
* アルミニウムはイオン化傾向が大きく、その酸化物は炭素や一酸化炭素では還元できない。そのため、原料のボーキサイトから得た酸化アルミニウム <chem>Al2O3</chem> を、融解させた氷晶石に溶かして電気分解し、単体を得る(溶融塩電解)。アルミニウムの製造には多量の電気エネルギーを必要とするので、使用済みのアルミニウム缶などを回収して再利用することは、エネルギーの節約になる。
* 銅は、黄銅鉱から得た粗銅を、電気分解によって純度の高い銅にする(電解精錬)。
{{コラム|身のまわりの酸化還元反応|2=
* 使い捨てカイロは、鉄粉が空気中の酸素によって酸化されるときに発生する熱を利用している。
* 食品の酸化を防ぐために、ビタミンC(アスコルビン酸)などの還元剤が、酸化防止剤として加えられることがある。酸化防止剤は、自らが酸化されやすく、食品の成分の代わりに酸化される。
* 塩素系漂白剤に含まれる次亜塩素酸ナトリウムは、強い酸化作用によって色素を分解し、漂白や殺菌に用いられる。
* 鉄がさびるのは、鉄が空気中の酸素や水によって酸化されるためである。鉄の表面を亜鉛でめっきしたトタンでは、イオン化傾向の大きい亜鉛が先に酸化されるので、鉄がさびにくい。
}}
[[カテゴリ:高等学校化学|さんかかんけんはんのう]]
4mscanda7y641i2ufq7sl7lwzbmaya9
304711
304710
2026-10-14T15:22:05Z
Nermer314
62933
304711
wikitext
text/x-wiki
{{pathnav|高等学校の学習|高等学校理科|高等学校化学|[[高等学校 化学基礎|化学基礎]]|pagename=酸化還元反応|frame=1|small=1}}
== 酸化と還元の定義 ==
銅 <chem>Cu</chem> の粉末を空気中で加熱すると、銅が空気中の酸素と結合して、酸化銅(II) <chem>CuO</chem> が得られる。
:<chem>2Cu + O2 -> 2CuO</chem>
このように、物質に酸素が化合することを'''酸化'''という。この反応では、銅が'''酸化されて'''酸化銅(II)になった。酸化によって生成した物質を'''酸化物'''という。このような酸化の反応を'''酸化反応'''という。
つぎに、この酸化銅(II)の粉末を耐熱ガラスなどに入れ、水素を通じながら加熱すると、粉末は赤褐色の銅に戻る。
これは、水素が酸化銅(II)から酸素を奪い、もとの銅に戻した変化である。
:<chem>CuO + H2 -> Cu + H2O</chem>
このように、ある物質が酸素を失うことを'''還元'''という。この反応では、酸化銅(II)が還元されて銅になった。このような還元の反応を'''還元反応'''という。この反応では、水素は酸化されて水になっている。このように、酸化反応と還元反応は同時に起こる。そこで、同時に起こる酸化反応と還元反応とをまとめて、'''酸化還元反応'''という。
酸化銅(II)は、銅(II)イオン <chem>Cu^2+</chem> と酸化物イオン <chem>O^2-</chem> からなる。還元されて銅になるとき、<chem>Cu^2+</chem> は電子を受け取って <chem>Cu</chem> になっている。このように、酸化と還元は、電子の授受で考えることができる。原子やイオンが電子を受け取ることを還元、電子を失うことを酸化と定義すると、酸素や水素が関係しない反応にも、酸化と還元の考え方を広げられる。このように、物質の酸化と還元を一般に判別するには、電子の授受で考える。
酸化と還元を、酸素・水素・電子の出入りでまとめると、次の表のようになる。
{| class="wikitable"
! !! 酸素 !! 水素 !! 電子
|-
! 酸化
| 得る(化合する) || 失う || 失う
|-
! 還元
| 失う || 得る || 得る
|}
=== 例 ===
マグネシウムを空気中で燃焼させると、酸化マグネシウムが生じる。
:<chem>2Mg + O2 -> 2MgO</chem>
(マグネシウムが酸化(酸素が化合)して、酸化マグネシウムになった)
この反応は、次の2つのイオン半反応式に分けて表すことができる。電子 <chem>e-</chem> を含む、このような式を'''半反応式'''という。
:<chem>2Mg -> 2Mg^2+ + 4e-</chem>
:<chem>O2 + 4e- -> 2O^2-</chem>
マグネシウムは電子を失っているので酸化されており、酸素は電子を得ているので還元されている。酸化還元反応の化学反応式は、半反応式をつくり、電子の数が等しくなるようにして足し合わせることで作る。
== 酸化数 ==
イオン結合では電子の授受の方向が判別しやすいが、共有結合からなる物質の反応では、電子の授受の方向が判別しにくい場合が多い。そこで、共有結合の場合にも酸化の度合いを定められるように、'''酸化数'''という概念が考えられた。酸化数は、次の規則で決める。
'''酸化数の決め方'''
* 単体の原子の酸化数は0とする。
(例)単体の水素 <chem>H2</chem>、酸素 <chem>O2</chem>、炭素 <chem>C</chem>、鉄 <chem>Fe</chem> の酸化数は、いずれも0である。
* 単原子イオンの酸化数は、イオンの価数(電荷)に等しい。
(例)<chem>Na+</chem> の酸化数は +1、<chem>Cl-</chem> の酸化数は -1、<chem>Al^3+</chem> の酸化数は +3 である。
* 化合物中の水素原子 <chem>H</chem> の酸化数は '''+1'''、酸素原子 <chem>O</chem> の酸化数は '''-2''' とする。ただし、過酸化水素 <chem>H2O2</chem> では <chem>O</chem> の酸化数は -1 とする。<br />
なお、水素化ナトリウム <chem>NaH</chem> のような金属の水素化物では、<chem>H</chem> の酸化数は -1 である。
* 化合物中のアルカリ金属原子の酸化数は +1、アルカリ土類金属原子の酸化数は +2 である。
* イオンではない化合物(電気的に中性な化合物)では、構成原子の酸化数の総和は0である。多原子イオンでは、構成原子の酸化数の総和は、イオンの価数に等しい。構成原子の酸化数が判断しにくい場合は、この規則を用いて、酸化数を決める。
(例)<chem>H2O</chem> では、水素原子の酸化数 +1 が2個と、酸素原子の酸化数 -2 が1個であるから、総和は <math>(+1) \times 2 + (-2) = 0</math> となり、確かに0である。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題1 酸化数の求め方'''
|-
|style="padding:5px"|
次の物質中の、指定した原子の酸化数を求めよ。(1) <chem>H2SO4</chem> の <chem>S</chem> (2) <chem>KMnO4</chem> の <chem>Mn</chem> (3) <chem>Cr2O7^2-</chem> の <chem>Cr</chem> (4) <chem>NH3</chem> の <chem>N</chem>
|}
{{解答|例題1の解答}}
求める酸化数を <math>x</math> とおく。
* (1) <chem>H2SO4</chem> は中性であるから、<math>(+1) \times 2 + x + (-2) \times 4 = 0</math> より、<math>x = +6</math>
* (2) <chem>KMnO4</chem> は中性で、<chem>K</chem> は +1 であるから、<math>(+1) + x + (-2) \times 4 = 0</math> より、<math>x = +7</math>
* (3) <chem>Cr2O7^2-</chem> は電荷が -2 であるから、<math>2x + (-2) \times 7 = -2</math> より、<math>x = +6</math>
* (4) <chem>NH3</chem> は中性であるから、<math>x + (+1) \times 3 = 0</math> より、<math>x = -3</math>
{{証明終わり}}
同じ元素でも、化合物によって酸化数はさまざまな値をとる。窒素と硫黄の例を、次の表に示す。
{| class="wikitable" style="text-align:center;"
! 窒素を含む物質
| <chem>NH3</chem> || <chem>N2</chem> || <chem>NO</chem> || <chem>NO2</chem> || <chem>HNO3</chem>
|-
! <chem>N</chem> の酸化数
| <math>-3</math> || <math>0</math> || <math>+2</math> || <math>+4</math> || <math>+5</math>
|-
! 硫黄を含む物質
| <chem>H2S</chem> || <chem>S</chem> || <chem>SO2</chem> || <chem>H2SO4</chem> || <chem>SO4^2-</chem>
|-
! <chem>S</chem> の酸化数
| <math>-2</math> || <math>0</math> || <math>+4</math> || <math>+6</math> || <math>+6</math>
|}
酸化数が中間の値をとる物質(<chem>SO2</chem> など)は、反応する相手によって、酸化剤にも還元剤にもなることがある。
=== 酸化数と酸化・還元 ===
酸化数を使うと、酸化還元を次のように判別できる。
{| class="wikitable"
! !! 酸化数 !! 電子
|-
! 酸化された
| 増加する || 失う
|-
! 還元された
| 減少する || 得る
|}
たとえば、<chem>CuO + H2 -> Cu + H2O</chem> では、<chem>Cu</chem> の酸化数が +2 から 0 に減少しているので、<chem>CuO</chem> は還元されたことがわかる。<chem>H</chem> の酸化数は 0 から +1 に増加しているので、<chem>H2</chem> は酸化されたことがわかる。
また、酸化数が変化しない反応は、酸化還元反応ではない。酸化還元反応では、酸化された原子の酸化数の増加の総和と、還元された原子の酸化数の減少の総和が等しい。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題2 酸化還元反応の判別'''
|-
|style="padding:5px"|
次の反応のうち、酸化還元反応であるものを選び、酸化された物質と還元された物質を答えよ。
:(1) <chem>2KI + Cl2 -> 2KCl + I2</chem>
:(2) <chem>H2SO4 + 2NaOH -> Na2SO4 + 2H2O</chem>
:(3) <chem>SO2 + 2H2S -> 3S + 2H2O</chem>
|}
{{解答|例題2の解答}}
* (1) <chem>I</chem> の酸化数が <math>-1</math> から <math>0</math> に増加し、<chem>Cl</chem> の酸化数が <math>0</math> から <math>-1</math> に減少している。酸化還元反応であり、<chem>KI</chem> が酸化され、<chem>Cl2</chem> が還元された。
* (2) すべての原子の酸化数が変化していない(<chem>H</chem> は <math>+1</math>、<chem>O</chem> は <math>-2</math>、<chem>S</chem> は <math>+6</math>、<chem>Na</chem> は <math>+1</math> のまま)。中和反応であり、酸化還元反応ではない。
* (3) <chem>SO2</chem> 中の <chem>S</chem> の酸化数が <math>+4</math> から <math>0</math> に減少し、<chem>H2S</chem> 中の <chem>S</chem> の酸化数が <math>-2</math> から <math>0</math> に増加している。酸化還元反応であり、<chem>H2S</chem> が酸化され、<chem>SO2</chem> が還元された。酸化数の増加の総和は <math>(+2) \times 2 = +4</math>、減少の総和は <math>-4</math> で、つりあっている。
{{証明終わり}}
== 酸化剤と還元剤 ==
酸化還元反応で、相手の物質から電子を奪って相手を酸化する物質を'''酸化剤'''という。また、相手の物質に電子を与えて相手を還元する物質を'''還元剤'''という。酸化剤自身は還元され、還元剤自身は酸化される。したがって、酸化剤は、含まれる原子の酸化数が減少する物質であり、還元剤は、含まれる原子の酸化数が増加する物質である。
主な酸化剤と還元剤と、その反応(半反応式)は、次の表のとおりである。
{| class="wikitable"
|+ 主な酸化剤
!物質
!化学式
!反応
|-
|過酸化水素
|<chem>H2O2</chem>
|<chem>H2O2 + 2H^+ + 2e- -> 2H2O</chem>
|-
|塩素
|<chem>Cl2</chem>
|<chem>Cl2 + 2e- -> 2Cl-</chem>
|-
|濃硝酸
|<chem>HNO3</chem>
|<chem>HNO3 + H^+ + e- -> NO2 + H2O</chem>
|-
|希硝酸
|<chem>HNO3</chem>
|<chem>HNO3 + 3H^+ + 3e- -> NO + 2H2O</chem>
|-
|熱濃硫酸(加熱した濃硫酸)
|<chem>H2SO4</chem>
|<chem>H2SO4 + 2H^+ + 2e- -> SO2 + 2H2O</chem>
|-
|過マンガン酸カリウム(酸性下で)
|<chem>KMnO4</chem>
|<chem>MnO4^- + 8H^+ + 5e- -> Mn^2+ + 4H2O</chem>
|-
|二クロム酸カリウム(酸性下で)
|<chem>K2Cr2O7</chem>
|<chem>Cr2O7^2- + 14H^+ + 6e- -> 2Cr^3+ + 7H2O</chem>
|-
|二酸化硫黄
|<chem>SO2</chem>
|<chem>SO2 + 4H^+ + 4e- -> S + 2H2O</chem>
|}
{| class="wikitable"
|+ 主な還元剤
!物質
!化学式
!反応
|-
|水素
|<chem>H2</chem>
|<chem>H2 -> 2H^+ + 2e-</chem>
|-
|過酸化水素
|<chem>H2O2</chem>
|<chem>H2O2 -> O2 + 2H^+ + 2e-</chem>
|-
|スズ(II)イオン
|<chem>Sn^2+</chem>
|<chem>Sn^2+ -> Sn^4+ + 2e-</chem>
|-
|鉄(II)イオン
|<chem>Fe^2+</chem>
|<chem>Fe^2+ -> Fe^3+ + e-</chem>
|-
|二酸化硫黄
|<chem>SO2</chem>
|<chem>SO2 + 2H2O -> SO4^2- + 4H^+ + 2e-</chem>
|-
|硫化水素
|<chem>H2S</chem>
|<chem>H2S -> S + 2H^+ + 2e-</chem>
|-
|蓚酸
|<chem>H2C2O4</chem><br>(<chem>(COOH)2</chem>とも)
|<chem>H2C2O4 -> 2CO2 + 2H^+ + 2e-</chem>
|}
過酸化水素 <chem>H2O2</chem> と二酸化硫黄 <chem>SO2</chem> は、相手によって酸化剤にも還元剤にもなる。たとえば、<chem>H2O2</chem> は、過マンガン酸カリウムのような強い酸化剤に対しては還元剤としてはたらき、<chem>KI</chem> のような還元剤に対しては酸化剤としてはたらく。なお、過酸化水素が酸化剤としてはたらく反応は、塩基性の水溶液中では <chem>H2O2 + 2e- -> 2OH-</chem> と表される。
これらの酸化剤・還元剤とその反応は、覚えておくとよい。このとき、酸化剤・還元剤が還元・酸化される前後の物質だけを覚えておけば、反応式を導くことができる。
たとえば、二クロム酸イオンが還元される反応は、<chem>Cr2O7^2- -> Cr^3+</chem> と変化することさえ覚えておけば、次のように、両辺で原子の個数と電荷の和が等しいことから、反応式が導ける。
# <chem>Cr</chem> の個数をそろえる <chem>Cr2O7^2- -> 2Cr^3+</chem>
# <chem>H2O</chem> と <chem>H^+</chem> を、原子の数が一致するように加える <chem>Cr2O7^2- + 14H^+ -> 2Cr^3+ + 7H2O</chem>
# <chem>e-</chem> を、電荷の和が一致するように加える <chem>Cr2O7^2- + 14H^+ + 6e- -> 2Cr^3+ + 7H2O</chem>
=== 酸化還元反応式のつくり方 ===
酸化剤の半反応式と還元剤の半反応式を、電子の数が等しくなるように何倍かして足し合わせると、電子 <chem>e-</chem> が消去され、酸化還元反応のイオン反応式が得られる。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題3 過マンガン酸カリウムと過酸化水素'''
|-
|style="padding:5px"|
硫酸酸性の過マンガン酸カリウム水溶液に、過酸化水素水を加えると、過マンガン酸イオンが還元されて <chem>Mn^2+</chem> になり、酸素が発生する。この反応のイオン反応式と化学反応式を書け。
|}
{{解答|例題3の解答}}
酸化剤 <chem>MnO4^-</chem> と還元剤 <chem>H2O2</chem> の半反応式は、それぞれ次のとおりである。
:<chem>MnO4^- + 8H^+ + 5e- -> Mn^2+ + 4H2O</chem> ・・・(1)
:<chem>H2O2 -> O2 + 2H^+ + 2e-</chem> ・・・(2)
電子の数を10個にそろえるため、(1)を2倍、(2)を5倍して足し合わせる。
:<chem>2MnO4^- + 5H2O2 + 6H^+ -> 2Mn^2+ + 5O2 + 8H2O</chem>
これがイオン反応式である。両辺に <chem>2K+</chem> と <chem>3SO4^2-</chem> を加えると、化学反応式が得られる。
:<chem>2KMnO4 + 5H2O2 + 3H2SO4 -> 2MnSO4 + 5O2 + K2SO4 + 8H2O</chem>
{{証明終わり}}
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題4 ヨウ化カリウムと過酸化水素'''
|-
|style="padding:5px"|
硫酸酸性のヨウ化カリウム水溶液に過酸化水素水を加えると、ヨウ素 <chem>I2</chem> が生じて、溶液が褐色になる。この反応のイオン反応式を書け。
|}
{{解答|例題4の解答}}
過酸化水素は酸化剤、ヨウ化物イオンは還元剤としてはたらく。それぞれの半反応式は、次のとおりである。
:<chem>H2O2 + 2H^+ + 2e- -> 2H2O</chem> ・・・(1)
:<chem>2I^- -> I2 + 2e-</chem> ・・・(2)
電子の数がどちらも2個でそろっているので、(1)と(2)をそのまま足し合わせる。
:<chem>H2O2 + 2I^- + 2H^+ -> I2 + 2H2O</chem>
この反応で、<chem>H2O2</chem> は酸化剤としてはたらいている。過マンガン酸カリウムとの反応(前の例題)では還元剤としてはたらいていたことと比べると、過酸化水素が相手によって酸化剤にも還元剤にもなることがわかる。
{{証明終わり}}
=== 酸化還元滴定 ===
酸化剤と還元剤が過不足なく反応するとき、
:<math>\text{酸化剤が受け取る電子の物質量} = \text{還元剤が失う電子の物質量}</math>
が成り立つ。この関係を利用して、濃度のわかっている酸化剤(または還元剤)の水溶液から、濃度のわからない還元剤(または酸化剤)の水溶液の濃度を求める操作を'''酸化還元滴定'''という。
過マンガン酸カリウムを用いる滴定では、指示薬を加える必要がない。<chem>MnO4^-</chem> は赤紫色であるが、硫酸酸性の溶液中で還元されて生じる <chem>Mn^2+</chem> はほとんど無色である。そのため、還元剤の溶液に過マンガン酸カリウム水溶液を滴下していくと、還元剤が残っている間は赤紫色がすぐに消える。還元剤がすべて反応すると、赤紫色が消えずに残るので、この点を終点とする。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題5 酸化還元滴定'''
|-
|style="padding:5px"|
0.0500 mol/L のシュウ酸 <chem>H2C2O4</chem> 水溶液 10.0 mL に希硫酸を加えて温め、濃度のわからない過マンガン酸カリウム水溶液で滴定したところ、8.00 mL を加えたところで、赤紫色が消えなくなった。過マンガン酸カリウム水溶液のモル濃度を求めよ。
|}
{{解答|例題5の解答}}
半反応式は、次のとおりである。
:<chem>MnO4^- + 8H^+ + 5e- -> Mn^2+ + 4H2O</chem>
:<chem>H2C2O4 -> 2CO2 + 2H^+ + 2e-</chem>
<chem>MnO4^-</chem> 1 mol は電子を 5 mol 受け取り、<chem>H2C2O4</chem> 1 mol は電子を 2 mol 失う。過マンガン酸カリウム水溶液のモル濃度を <math>x</math> [mol/L] とすると、受け取る電子と失う電子の物質量が等しいことから、
:<math>5 \times x \times \dfrac{8.00}{1000} = 2 \times 0.0500 \times \dfrac{10.0}{1000}</math>
:<math>x = 2.50 \times 10^{-2}\ \mathrm{mol/L}</math>
となる。なお、2つの半反応式から電子を消去すると、<chem>2MnO4^- + 5H2C2O4 + 6H^+ -> 2Mn^2+ + 10CO2 + 8H2O</chem> となり、<chem>MnO4^-</chem> と <chem>H2C2O4</chem> は物質量の比 2:5 で反応することがわかる。
{{証明終わり}}
== 金属と酸化還元反応 ==
=== イオン化傾向 ===
金属元素の単体が、溶液中で陽イオンになろうとする性質を'''イオン化傾向'''という。陽イオンになりやすい金属ほど、イオン化傾向が大きい。
例として、亜鉛 <chem>Zn</chem> を希塩酸 <chem>HCl</chem> の水溶液に入れると、亜鉛は電子を失って <chem>Zn^2+</chem> になって溶け、水素が発生する。
:<chem>Zn + 2H^+ -> Zn^2+ + H2</chem>
一方、銀 <chem>Ag</chem> を希塩酸に入れても、反応は起こらない。
このように、金属のイオン化傾向の大きさは、金属ごとに異なる。
銅を希塩酸に入れた場合も、何も反応しない。以上の例では、銅と銀のイオン化傾向の大小は、わからない。
=== 銅と銀のイオン化傾向 ===
;硝酸銀溶液と銅の場合
銅と銀のイオン化傾向を比べるために、硝酸銀 <chem>AgNO3</chem> の水溶液に、銅線や銅板を入れる。ここでは、銅板を入れたとする。すると、銅板の表面に銀が析出する。一方、銅は陽イオンとなって溶け出し、溶液はしだいに青くなる。この青色は、銅(II)イオンの色である。
この変化を反応式で書くと、
:<chem>Cu + 2Ag^+ -> Cu^2+ + 2Ag</chem>
となる。なお、この反応では、析出した銀が樹木が枝を伸ばすように成長することがあり、これを'''銀樹'''という。
;硫酸銅溶液と銀の場合
一方、硫酸銅(II) <chem>CuSO4</chem> の水溶液に銀板 <chem>Ag</chem> を入れても、何も析出せず、変化は起きない。
これらのことから、銅は銀よりもイオン化傾向が大きいことがわかる。
=== 亜鉛と銅のイオン化傾向 ===
また、硫酸銅(II)の水溶液に亜鉛板 <chem>Zn</chem> を入れると、亜鉛の表面に銅が析出する。
:<chem>Zn + Cu^2+ -> Zn^2+ + Cu</chem>
このことから、亜鉛 <chem>Zn</chem> は銅 <chem>Cu</chem> よりもイオン化傾向が大きいことがわかる。
=== イオン化列 ===
さまざまな水溶液と金属の組み合わせで、イオン化傾向の比較の実験を行った結果、イオン化傾向の大きさの順序が決定された。
左から順に、イオン化傾向の大きい金属を並べると、次のようになる。
:<chem>Li</chem> > <chem>K</chem> > <chem>Ca</chem> > <chem>Na</chem> > <chem>Mg</chem> > <chem>Al</chem> > <chem>Zn</chem> > <chem>Fe</chem> > <chem>Ni</chem> > <chem>Sn</chem> > <chem>Pb</chem> > (<chem>H2</chem>) > <chem>Cu</chem> > <chem>Hg</chem> > <chem>Ag</chem> > <chem>Pt</chem> > <chem>Au</chem>
金属を、イオン化傾向の大きさの順に並べたものを、金属の'''イオン化列'''という。
水素は金属ではないが、比較のために、イオン化列に加えられる。
金属元素は、上記のほかにもあるが、高校化学では、上記の金属のイオン化列を用いることが多い。
イオン化列を記憶するための語呂合わせとして、
「リッチに貸そうかな、まあ、あてにすな、ひどすぎる借金。」
などがある。ちなみに、この語呂合わせは、
「Liリッチに Kか そう かCa なNa、まMg あAl、あZn てFe にNi すSn なPb、ひH2 どCu すHg ぎAg る 借金Pt,Au。」
と対応している。
=== 水との反応 ===
イオン化傾向の大きい金属ほど、水と反応しやすい。
{| class="wikitable"
|+ 金属と水の反応
! 金属 !! 水との反応
|-
| <chem>Li, K, Ca, Na</chem> || 常温の水と反応して、水素を発生し、水酸化物になる。
|-
| <chem>Mg</chem> || 熱水と反応して、水素を発生する。
|-
| <chem>Al, Zn, Fe</chem> || 高温の水蒸気と反応する。
|-
| <chem>Ni</chem> 以下のもの || 水とは、ふつう反応しない。
|}
例として、ナトリウムは常温の水と激しく反応する。
:<chem>2Na + 2H2O -> 2NaOH + H2</chem>
マグネシウムは、常温の水とはほとんど反応しないが、熱水とは反応して水素を発生する。
:<chem>Mg + 2H2O -> Mg(OH)2 + H2</chem>
鉄は、高温の水蒸気と反応して、四酸化三鉄と水素を生じる。
:<chem>3Fe + 4H2O -> Fe3O4 + 4H2</chem>
=== 酸との反応 ===
* <chem>Li</chem>~<chem>Pb</chem> と酸
水素よりイオン化傾向が大きい金属は、希塩酸や希硫酸などの酸と反応し、水素を発生する。<chem>K</chem> や <chem>Ca</chem> などは、溶媒の水そのものとも激しく反応するので、ここでは考察の対象から外す。
:<chem>Mg + 2HCl -> MgCl2 + H2</chem>
:<chem>2Al + 6HCl -> 2AlCl3 + 3H2</chem>
:<chem>Zn + 2HCl -> ZnCl2 + H2</chem>
:<chem>Fe + H2SO4 -> FeSO4 + H2</chem>
* <chem>Pb</chem> と酸
<chem>Pb</chem> は、希塩酸や希硫酸とは、表面に水に溶けにくい塩化鉛(II) <chem>PbCl2</chem> や硫酸鉛(II) <chem>PbSO4</chem> ができるため、反応がほとんど進まない。
* <chem>Cu, Hg, Ag</chem> と酸
<chem>Cu, Hg, Ag</chem> は、塩酸や希硫酸には溶けない。これらを溶かすには、硝酸 <chem>HNO3</chem> や、熱濃硫酸のように、酸化力の強い酸が必要である。
:<chem>3Cu + 8HNO3 -> 3Cu(NO3)2 + 2NO + 4H2O</chem>(希硝酸)
:<chem>Cu + 4HNO3 -> Cu(NO3)2 + 2NO2 + 2H2O</chem>(濃硝酸)
:<chem>Cu + 2H2SO4 -> CuSO4 + SO2 + 2H2O</chem>(熱濃硫酸)
* <chem>Pt, Au</chem> と酸
<chem>Pt, Au</chem> は、硝酸や熱濃硫酸にも溶けない。これらを溶かすのは、'''王水'''である。王水は、濃塩酸と濃硝酸を、体積比3:1で混合した液である。
* 不動態
<chem>Al, Fe, Ni</chem> などは、濃硝酸に入れると、表面に緻密な酸化物の被膜ができるため、反応が進まない。このような金属の状態を'''不動態'''という。
== 酸化還元反応の利用 ==
=== 電池 ===
* 化学基礎では、電池の基本的な構造と各種電池の名称のみを取り扱う。そのため、詳しい解説は[[高校化学 電池と電気分解|電池と電気分解]]を参照すること。
酸化還元反応で放出される化学エネルギーを、電気エネルギーとして取り出す装置を'''電池'''という。イオン化傾向の異なる2種類の金属を電解質の水溶液に入れて導線でつなぐと、イオン化傾向の大きいほうの金属が電子を放出して陽イオンとなり、電子は導線を通って、もう一方の金属へ流れる。導線へ電子が流れ出す電極を'''負極'''、導線から電子が流れ込む電極を'''正極'''という。負極では酸化反応が、正極では還元反応が起こる。
たとえば、亜鉛板を硫酸亜鉛水溶液に、銅板を硫酸銅(II)水溶液に浸し、2つの水溶液を素焼き板などで仕切った電池を'''ダニエル電池'''という。この電池では、イオン化傾向の大きい亜鉛が負極、銅が正極となり、次の反応が起こる。
:負極: <chem>Zn -> Zn^2+ + 2e-</chem>(酸化)
:正極: <chem>Cu^2+ + 2e- -> Cu</chem>(還元)
全体としては、「亜鉛と銅のイオン化傾向」の節で述べた反応 <chem>Zn + Cu^2+ -> Zn^2+ + Cu</chem> と同じ反応が起こっている。
身のまわりでは、マンガン乾電池、アルカリマンガン乾電池などの一次電池(充電できない電池)や、鉛蓄電池、リチウムイオン電池などの二次電池(充電してくり返し使える電池)が用いられている。
=== 金属の精錬 ===
* 酸化物や硫化物から金属の単体を取り出すことを'''精錬'''という。これも、化学基礎では鉄しか反応式まで扱わないので、詳しい解説は[[高校化学 電池と電気分解|電池と電気分解]]を参照すること。
==== 鉄の精錬 ====
* 鉄は、鉄の酸化物を多く含む鉱石(赤鉄鉱 <chem>Fe2O3</chem> や磁鉄鉱 <chem>Fe3O4</chem> など)を、コークス(炭素)を用いて還元して得られる。<br />
鉄鉱石、コークス、石灰石を'''溶鉱炉'''(高炉)に入れ、下から熱風を送ると、コークスの燃焼で生じた一酸化炭素 <chem>CO</chem> が鉄の酸化物を還元する。赤鉄鉱の場合、反応は次のように表される。
:<chem>Fe2O3 + 3CO -> 2Fe + 3CO2</chem>
この反応で、<chem>Fe</chem> の酸化数は +3 から 0 に減少しており、<chem>Fe2O3</chem> は還元されている。一方、<chem>C</chem> の酸化数は +2(<chem>CO</chem> 中)から +4(<chem>CO2</chem> 中)に増加しており、<chem>CO</chem> は酸化されている。溶鉱炉から得られる鉄を'''銑鉄'''といい、炭素を約4%含み、硬いがもろい。銑鉄を転炉に入れて酸素を吹き込み、炭素を減らすと、強くて粘り強い'''鋼'''になる。
==== アルミニウムと銅 ====
* アルミニウムはイオン化傾向が大きく、その酸化物は炭素や一酸化炭素では還元できない。そのため、原料のボーキサイトから得た酸化アルミニウム <chem>Al2O3</chem> を、融解させた氷晶石に溶かして電気分解し、単体を得る(溶融塩電解)。アルミニウムの製造には多量の電気エネルギーを必要とするので、使用済みのアルミニウム缶などを回収して再利用することは、エネルギーの節約になる。
* 銅は、黄銅鉱から得た粗銅を、電気分解によって純度の高い銅にする(電解精錬)。
{{コラム|身のまわりの酸化還元反応|
* 使い捨てカイロは、鉄粉が空気中の酸素によって酸化されるときに発生する熱を利用している。
* 食品の酸化を防ぐために、ビタミンC(アスコルビン酸)などの還元剤が、酸化防止剤として加えられることがある。酸化防止剤は、自らが酸化されやすく、食品の成分の代わりに酸化される。
* 塩素系漂白剤に含まれる次亜塩素酸ナトリウムは、強い酸化作用によって色素を分解し、漂白や殺菌に用いられる。
* 鉄がさびるのは、鉄が空気中の酸素や水によって酸化されるためである。鉄の表面を亜鉛でめっきしたトタンでは、イオン化傾向の大きい亜鉛が先に酸化されるので、鉄がさびにくい。
}}
[[カテゴリ:高等学校化学|さんかかんけんはんのう]]
32xl4wl2839k5r78eweinhmhv2wnocs
弁理士法第57条
0
22522
304732
294096
2026-10-15T11:49:33Z
Kyube
57
少し加筆
304732
wikitext
text/x-wiki
==条文==
(会則)
;第57条
#弁理士会は、会則を定め、これに次に掲げる事項を記載しなければならない。
##名称及び事務所の所在地
##入会及び退会に関する規定
##会員の種別及びその権利義務に関する規定
##役員に関する規定
##会議に関する規定
##支部に関する規定
##弁理士の登録に関する規定
##登録審査会に関する規定
##会員の品位保持に関する規定
##会員の研修に関する規定
##実務修習に関する規定
##会員の業務に関する紛議の調停に関する規定
##弁理士会及び会員に関する情報の提供に関する規定
##会費に関する規定
##会計及び資産に関する規定
##事務局に関する規定
##その他弁理士会の目的を達成するために必要な規定
#会則の制定又は変更(政令で定める重要な事項に係る変更に限る。)は、経済産業大臣の認可を受けなければ、その効力を生じない。
==解説==
日本弁理士会が会則を定める必要があること及び日本弁理士会の会則において定めるべき規定の内訳を定め、並びに、同会則の制定及び変更のうち重要な事項については経済産業大臣の認可が必要である旨定める。本条の規定に従い、日本弁理士会は会則を定めている。
本条第2項にいう重要な事項は、本条第1項第3号から第5号まで及び第7号から第11号までに掲げる事項(同項第10号に掲げる事項にあっては、[[弁理士法第31条の2|第31条の2]]に規定する研修(いわゆる継続研修)に関する事項に限る。)である(弁理士法施行令第5条)。
==参照条文==
==判例==
==外部リンク==
* [https://www.jpaa.or.jp/cms/wp-content/uploads/2025/04/constitution_20250422.pdf 日本弁理士会会則] (pdf)
----
{{前後
|[[コンメンタール弁理士法|弁理士法]]
|[[コンメンタール弁理士法#7|第7章 日本弁理士会]]
|[[弁理士法第56条]]<br>(設立、目的及び法人格)
|[[弁理士法第58条]]<br>(支部)
}}
{{stub|law}}
[[category:弁理士法|57]]
c63w5saq30tbkq8s9pcaj10kmjgz0fl
高等学校日本史探究
0
36598
304722
304606
2026-10-14T22:57:48Z
Kwawe
68789
/* 第4章 古代の国家・社会の変容 */
304722
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校日本史探究
高等学校日本史探究のページです。{{進捗状況}} 本ページの目次と項目の配列は、実教出版株式会社の新課程教科書「[https://www.jikkyo.co.jp/book/detail/23010423 日本史探究]」(日探702・日探007-901)に合わせて作成しています。文章の配列も原則上記教科書会社さんに従いました。学習指導要領に定められた日本史探究の標準単位数は'''3単位です。'''
※本ページは大学の二次試験まで対応させるため、日本史探究の完成時期は未定です。当面の間は日本史Bを参照して下さい。
== 第1部 原始・古代の日本と東アジア ==
INTRODUCTION
=== 第1章 日本文化のあけぼの ===
# [[高等学校日本史探究/日本列島最古の文化Ⅰ|日本列島最古の文化Ⅰ]]{{進捗|100%|2024-09-21}}(人類の誕生と日本列島への居住)
# [[高等学校日本史探究/日本列島最古の文化Ⅱ|日本列島最古の文化Ⅱ]]{{進捗|100%|2024-10-01}}(日本の旧石器時代)
# [[高等学校日本史探究/縄文時代の社会と文化|縄文時代の社会と文化]]{{進捗|100%|2026-09-27}}(縄文文化の成立~縄文社会と縄文人)
# 弥生時代の社会と文化Ⅰ{{進捗|00%|2023-11-11}}
# 弥生時代の社会と文化Ⅱ{{進捗|00%|2023-11-11}}
=== 第2章 ヤマト政権の成立と古墳文化 ===
# 小国の分立と邪馬台国{{進捗|00%|2023-11-11}}
# 古墳の出現とヤマト政権の成立{{進捗|00%|2023-11-11}}
# ヤマト政権の展開と統治の進展{{進捗|00%|2023-11-11}}
# 古墳時代の生活と文化{{進捗|00%|2023-11-11}}
=== 第3章 律令国家の形成 ===
# [[高等学校日本史探究/古代国家の形成Ⅰ|古代国家の形成Ⅰ]]{{進捗|100%|2024-11-18}}(6世紀の朝鮮半島と倭~7世紀の東アジアと倭国)
# [[高等学校日本史探究/古代国家の形成Ⅱ|古代国家の形成Ⅱ]]{{進捗|100%|2025-02-01}}(大化の改新~東北遠征と白村江の戦い)
# [[高等学校日本史探究/古代国家の形成Ⅲ|古代国家の形成Ⅲ]]{{進捗|100%|2025-02-11}}(近江朝廷と壬申の乱~天武・持統期の政治改革)
# [[高等学校日本史探究/飛鳥文化・白鳳文化|飛鳥文化・白鳳文化]]{{進捗|100%|2024-11-06}}
# [[高等学校日本史探究/律令制度|律令制度]]{{進捗|100%|2025-06-03}}(大宝律令の官制~土地・人民の支配制度)
# [[高等学校日本史探究/奈良時代の政治Ⅰ|奈良時代の政治Ⅰ]]{{進捗|100%|2025-07-21}}(遣唐使派遣と平城京遷都)
# [[高等学校日本史探究/奈良時代の政治Ⅱ|奈良時代の政治Ⅱ]]{{進捗|100%|2025-11-22}}(奈良時代初期の政策~度重なる遷都と鎮護国家の仏教)
# [[高等学校日本史探究/奈良時代の政治Ⅲ|奈良時代の政治Ⅲ]]{{進捗|100%|2025-12-21}}(公地公民制の修正~奈良時代後半の政争)
# 天平文化
STEP UP 1 [[高等学校日本史探究/奈良時代の人々の暮らし|奈良時代の人々の暮らし]]{{進捗|100%|2026-04-09}}(奈良時代の貴族生活~生活文化の発展と庶民の苦難)
=== 第4章 古代の国家・社会の変容 ===
# [[高等学校日本史探究/律令体制再編期の政治と社会Ⅰ|律令体制再編期の政治と社会Ⅰ]]{{進捗|100%|2026-10-11}}(平安京遷都と東北経営)
# [[高等学校日本史探究/律令体制再編期の政治と社会Ⅱ|律令体制再編期の政治と社会Ⅱ]]{{進捗|50%|2026-10-15}}(律令政治の再編成~法・儀式の整備と教育)
# 律令体制再編期の政治と社会Ⅲ{{進捗|00%|2026-09-5}}(密教の隆盛~弘仁・貞観文化)
# 摂関政治の成立と支配体制の転換
# 国風文化
== 第2部 中世の日本と世界 ==
INTRODUCTION
=== 第1章 荘園公領制の成立と院政 ===
※荘園公領制の成立と院政は2027年4月に記述します。
* 荘園公領制の成立と院政Ⅰ
* 荘園公領制の成立と院政Ⅱ
* 荘園公領制の成立と院政Ⅲ
* 荘園公領制の成立と院政Ⅳ
=== 第2章 中世の国家・社会の展開 ===
# 鎌倉幕府の成立と朝廷
# 中世に生きる人々
# 蒙古襲来と幕府の衰退
# 鎌倉文化
=== 第3章 中世の国家・社会の変容 ===
# 南北朝の動乱
# 室町幕府の政治と外交
# 室町社会の展開と応仁の乱
# 室町文化
# [[高等学校日本史探究/戦国大名の分国経営Ⅰ|戦国大名の分国経営Ⅰ]]{{進捗|100%|2025-02-15}}(戦国時代の特質~戦国の争乱)
# 戦国大名の分国経営Ⅱ{{進捗|00%|2023-00-00}}(分国経営)
# 戦国大名の分国経営Ⅲ{{進捗|00%|2025-02-15}}(都市の発達と町衆~経済の混乱)
STEP UP 2 東アジアのなかのアイヌ文化・琉球文化
STEP UP 3 女性と仏教
== 第3部 近世の日本と世界 ==
INTRODUCTION
=== 第1章 東アジア世界の変容と天下統一 ===
# 織豊政権
# 天下統一の完成
# 近世成立期の文化
歴史資料と近世の展望
=== 第2章 幕藩体制の成立と展開 ===
# 幕藩体制の成立
# 貿易の統制と対外関係
# 近世社会のしくみ
# 幕府政治の展開
# 経済の発展
# 元禄文化と学芸の発展
STEP UP 4 近世の遊郭
=== 第3章 近世の国家・社会の変容 ===
# 幕藩体制の動揺と幕政の改革
# 欧米列強の接近と天保の改革
# 近世文化の成熟と変容
STEP UP 5 百姓一揆と義民物語
== 第4部 近現代の地域・日本と世界 ==
INTRODUCTION(近代)
=== 第1章 開国から倒幕へ ===
歴史資料と近代の展望
=== 第2章 明治維新 ===
# 明治維新
# 文明開化
=== 第3章 近代国家の形成 ===
# 立憲国家への道
# 議会政治の展開と日清・日露戦争
# 産業革命と社会の変化
# 近代文化の形成と展開
STEP UP 6 日露戦争のアジアへの影響
=== 第4章 両大戦間の日本 ===
# 第一次世界大戦
# 政党政治の展開
# 市民文化の展開
STEP UP 7 近代日本の「食」と米
=== 第5章 十五年戦争と日本 ===
# 満洲事変
# 日中戦争
# アジア・太平洋戦争(太平洋戦争)
INTRODUCTION(現代)
=== 第6章 戦後日本の形成 ===
# 占領と民主改革
# 独立と日米安保体制の形成
# 高度経済成長下の日本
STEP UP 8 エネルギー革命
=== 第7章 グローバル化のなかの現代日本 ===
# 「国際化」する経済大国Ⅰ{{進捗|00%|2023-00-00}}(ドル=ショックと石油危機~安定成長への転換まで)
# 「国際化」する経済大国Ⅱ{{進捗|00%|2023-00-00}}(経済大国への道と国際化の時代)
# 「国際化」する経済大国Ⅲ{{進捗|00%|2023-00-00}}(貿易摩擦とバブル経済~「豊かさ」と社会・生活の変容まで)
# [[高等学校日本史探究/新たな世紀の日本へⅠ|新たな世紀の日本へⅠ]]{{進捗|100%|2026-04-10}}(冷戦の終結とグローバル化~湾岸戦争と平和維持活動まで)
# [[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]{{進捗|25%|2026-09-24}}(政界再編と55年体制の終結~行政改革と日米安保の変化まで)
# [[高等学校日本史探究/新たな世紀の日本へⅢ|新たな世紀の日本へⅢ]]{{進捗|100%|2026-09-23}}(「構造改革」と対テロ戦争~憲法改正論と政権交代まで)
# [[高等学校日本史探究/新たな世紀の日本へⅣ|新たな世紀の日本へⅣ]]{{進捗|25%|2026-09-24}}(新しい世界を目指して~平成時代・令和時代の文化史・科学史まで)
【STEP UP 9】[[高等学校日本史探究/多文化共生|多文化共生]]{{進捗|100%|2024-09-24}}
現代の日本の課題の探究
== 読書案内・学習方法 ==
* [[高等学校日本史探究/資料出所・読書案内|資料出所・読書案内]]
* [[学習方法/高校日本史|高校日本史学習方法]]{{進捗|100%|2026-04-29}}(新試験対応)
[[カテゴリ:高等学校日本史|探]]
lub6ar7yp2pd8b5mmax9t19ha4nngq0
高校化学 化学反応とエンタルピー
0
43317
304708
301380
2026-10-14T13:32:12Z
Nermer314
62933
304708
wikitext
text/x-wiki
{{pathnav|高等学校の学習|高等学校理科|高等学校化学|[[高等学校 化学|化学]]|pagename=化学反応とエンタルピー|frame=1|small=1}}
このページでは、いわゆる'''熱化学'''の内容について扱う。熱力学と関連が深い分野なので、[[高等学校物理基礎|物理基礎]]の既習を前提とする。必要があれば[[高校物理 熱力学]]も参照。
化学反応が起こると、多くの場合、反応物と生成物のもつ化学エネルギーの差により、熱の出入りが起こる。以下では、この現象を定量的に考える。
==化学反応と熱==
化学反応が起こり、人間の観察の対象となる部分を'''系'''という。系の外側を'''外界'''という。
熱力学第一法則 <math>\Delta U = Q - W</math> において、<math>\Delta U</math> は系の内部エネルギーの変化量、<math>Q</math> は'''系が外界から受け取った熱'''、<math>W</math> は'''系が外界にした仕事'''を表す。
定積変化では <math>W = 0</math> となるため、熱力学第一法則より <math>\Delta U = Q</math> である。つまり、定積の系では、反応に伴う熱の出入りの量は、内部エネルギーの変化量に等しい。
しかし、化学反応を定積条件下で行うことはまずない。ふつうの化学反応は、大気圧のもとの定圧条件下で行われる。
定圧変化を考えるために、次のように'''エンタルピー'''を定義する。
<math>U</math> を系の内部エネルギー、<math>p</math> を系の圧力、<math>V</math> を系の体積としたとき、<math>H = U + pV</math> を'''エンタルピー'''(熱含量、焓)という。単位はジュール(J)である。
外界の圧力 <math>p</math> が一定の定圧変化におけるエンタルピー変化は、
:<math>\Delta H = (U_1 + p V_1) - (U_0 + p V_0) = (U_1 - U_0) + p(V_1 - V_0) = \Delta U + p \Delta V</math>
となる。定圧変化では体積が変化するので、'''系は外界に仕事をする'''。このときの仕事 <math>W</math> は <math>p \Delta V</math> に等しい。したがって、熱力学第一法則より、
:<math>\Delta H = \Delta U + W = Q</math>
となる。
ここから、定圧の系において'''反応に伴う熱の出入りの量は、エンタルピー変化に等しい'''ことがわかる(逆にいえば、そうなるようにエンタルピーを定義したのである)。エンタルピーは、物質がもつエネルギーを表す物理量の一つである。
一般に、物質は'''エンタルピーが低いほど安定'''である。
==反応エンタルピー==
定圧条件下で化学反応により放出・吸収される熱量を'''反応エンタルピー'''といい、<math>\Delta H</math> で表す。
反応エンタルピーは、次のように表される。
:'''反応エンタルピー''' = ('''生成物'''のもつエンタルピー)− ('''反応物'''のもつエンタルピー)
系の熱を外界に放出しながら進む反応を'''発熱反応'''、外界の熱を系に吸収しながら進む反応を'''吸熱反応'''という。
発熱反応では、系の熱を外界に放出するので、系のもつエネルギー、すなわちエンタルピーは減少する。つまり、'''発熱反応では <math>\Delta H</math> は負'''である。
吸熱反応では、外界の熱を系に吸収するので、系のもつエンタルピーは増加する。つまり、'''吸熱反応では <math>\Delta H</math> は正'''である。
化学反応に伴うエンタルピー変化を表すとき、以下の2点に注意する。
:①物質の種類が同じでも、'''状態が違えばエンタルピーは異なる'''。
::物質の後ろに、固体ならば(固)または (s)、液体ならば(液)または (l)、気体ならば(気)または (g) と付ける。ここで、s は solid、l は liquid、g は gas の略である。
:::例)<chem>CO2(g)</chem>、<chem>H2O</chem>(液)
::同素体をもつ物質は、括弧の中に同素体名を書いて区別する。
:::例)<chem>C</chem>(黒鉛)、<chem>C</chem>(ダイヤモンド)、<chem>S</chem>(斜方硫黄)
:②'''注目する物質の係数を1とする'''。
::注目する物質の物質量を 1 mol とみなして考える。係数が分数になってもよい。
この2点を踏まえると、1 mol の水素が完全燃焼して液体の水が生成し、286 kJ の熱量が放出された反応は、次のように書ける。
[1] 化学反応式を書く
:<chem>2H2 + O2 -> 2H2O</chem>
[2] 着目する物質の係数を1にする
:<chem>H2 + 1/2 O2 -> H2O</chem>
[3] 物質の状態とエンタルピー変化を付記する。
:<chem>H2(g) + 1/2 O2(g) -> H2O(l)</chem><math>\quad \Delta H = -286 \, \mathrm{kJ}</math>
このような反応式を、'''エンタルピー変化を付した反応式'''という。<!-- 一部の参考書ではこちらも「熱化学方程式」「熱化学反応式」としていましたが、旧来の熱化学方程式との混同を避けるため採用しません。 -->
なお、エンタルピー変化を付した反応式には、'''現実には起こり得ない反応も多い'''。起こり得ない理由は後述する。
==反応エンタルピーの種類==
反応エンタルピーは、反応の種類によって固有の名称で呼ばれるものもある。
それらは、着目する物質 1 mol あたりの熱量(単位: kJ/mol)で表されるが、'''反応式の中では単位のうち /mol を省略する'''。
;'''燃焼エンタルピー'''
物質 1 mol が'''完全燃焼'''するときの反応エンタルピー。
:例)<chem>CO(g) + 1/2 O2(g) -> CO2(g)</chem><math>\quad \Delta H = -283 \, \mathrm{kJ}</math>
;'''生成エンタルピー'''
化合物 1 mol を構成元素の'''単体'''から生成するときの反応エンタルピー。単体の生成エンタルピーは 0 とする。同素体が存在する元素は、25 ℃ で最も安定な同素体から生成する反応を用いる。
:例)<chem>1/2 N2(g) + 1/2 O2(g) -> NO(g)</chem><math>\quad \Delta H = 90.3 \, \mathrm{kJ}</math>
;'''溶解エンタルピー'''
溶質 1 mol が'''多量の溶媒'''に溶解するときの反応エンタルピー。溶媒が水の場合、aq という記号を用いる。aq は aqua の略である。
:例)<chem>NaOH(s) + aq -> NaOH aq</chem><math>\quad \Delta H = -44.5 \, \mathrm{kJ}</math>
なお、化学式に aq をつけたものは、その物質が水溶液の状態であることを表す。
;'''中和エンタルピー'''
酸と塩基が反応し、'''水''' 1 mol が生成するときの反応エンタルピー。
:例)<chem>H+ aq + OH- aq -> H2O(l)</chem><math>\quad \Delta H = -56.5 \, \mathrm{kJ}</math>
;状態変化とエンタルピー
物質の状態変化においても熱の出入りがあるので、エンタルピー変化を用いて表せる。便宜上、反応エンタルピーの一種に分類する。名称は、状態変化の名(融解、蒸発、昇華、凝固、凝縮、凝華)にエンタルピーをつけたものとなる。
:例)<chem>H2O(g) -> H2O(l)</chem><math>\quad \Delta H = -41 \, \mathrm{kJ}</math>
なお、融解エンタルピーと凝固エンタルピー、蒸発エンタルピーと凝縮エンタルピー、昇華エンタルピーと凝華エンタルピーは、それぞれ逆反応の関係にある。そのため、反応式の両辺を入れ替えて <math>\Delta H</math> の符号を反転させれば一致する。
;反応エンタルピーの種類のまとめ
{| class="wikitable"
! 名称 !! 係数を1とする物質 !! <math>\Delta H</math> の符号 !! 例(25 ℃)
|-
| 燃焼エンタルピー || 燃焼する物質 || つねに負 || <chem>CO</chem>:<math>-283\ \mathrm{kJ/mol}</math>
|-
| 生成エンタルピー || 生成する化合物 || 正・負のどちらもある || <chem>NO</chem>:<math>90.3\ \mathrm{kJ/mol}</math>
|-
| 溶解エンタルピー || 溶解する溶質 || 正・負のどちらもある || <chem>NaOH</chem>:<math>-44.5\ \mathrm{kJ/mol}</math>
|-
| 中和エンタルピー || 生成する水 || 負 || 強酸と強塩基:<math>-56.5\ \mathrm{kJ/mol}</math>
|-
| 蒸発エンタルピー || 蒸発する物質 || 正 || <chem>H2O</chem>:<math>+44\ \mathrm{kJ/mol}</math>
|-
| 融解エンタルピー || 融解する物質 || 正 || <chem>H2O</chem>:<math>+6.0\ \mathrm{kJ/mol}</math>(0 ℃)
|}
溶解エンタルピーは、物質によって符号が異なる。たとえば、硝酸アンモニウム <chem>NH4NO3</chem> の溶解は吸熱であり、冷却パックに利用されている。
==ヘスの法則==
[[File:Hess cycles NaOH jp.svg|500px]]
図のように、固体の水酸化ナトリウムから塩化ナトリウムを生成する反応には2つの経路があるが、どちらの経路で合成を行っても、出入りする熱量(反応エンタルピー)の総和は同じである。
化学反応のエンタルピー変化は、反応前後の物質の種類と状態で決まり、途中の反応経路や反応方法によらない。このことを'''ヘスの法則'''または'''総熱量保存則'''という。
ヘスの法則を応用すると、複数の反応式から、未知の反応エンタルピーを求められる。
;応用1:反応式の連立
次の反応の反応エンタルピー <math>Q\ \mathrm{[kJ/mol]}</math> を求めたい。
:<chem>C(graphite) + 1/2 O2(g) -> CO(g)</chem><math>\quad \Delta H = Q \, \mathrm{kJ}</math>・・・Ⅰ
黒鉛と一酸化炭素の燃焼エンタルピーは、次のようにわかっている。
:<chem>C(graphite) + O2(g) -> CO2(g)</chem><math>\quad \Delta H = -394 \, \mathrm{kJ}</math>・・・Ⅱ
:<chem>CO(g) + 1/2 O2(g) -> CO2(g)</chem><math>\quad \Delta H = -283 \, \mathrm{kJ}</math>・・・Ⅲ
ヘスの法則より、ⅡとⅠ+Ⅲはエンタルピー変化が等しいので、ⅡからⅢを引けばⅠを求められる。
:<chem>C(graphite) + O2(g) - CO(g) - 1/2 O2(g) -> CO2(g) - CO2(g)</chem><math>\quad \Delta H = -394 - (-283) \, \mathrm{kJ}</math>
:<chem>C(graphite) + 1/2 O2(g) -> CO(g)</chem><math>\quad \Delta H = -111 \, \mathrm{kJ}</math>※
:<math>\therefore Q = -111\ \mathrm{kJ/mol}</math>
※化学反応式に引き算が残ったら、移項する。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題1 エタノールの生成エンタルピー'''
|-
|style="padding:5px"|
エタノール <chem>C2H5OH</chem>(液)の燃焼エンタルピーを <math>-1368\ \mathrm{kJ/mol}</math>、黒鉛の燃焼エンタルピーを <math>-394\ \mathrm{kJ/mol}</math>、水素の燃焼エンタルピー(液体の水が生成)を <math>-286\ \mathrm{kJ/mol}</math> として、エタノール(液)の生成エンタルピーを求めよ。
|}
{{解答|例題1の解答}}
それぞれの反応式は、次のとおりである。
:<chem>C2H5OH(l) + 3O2(g) -> 2CO2(g) + 3H2O(l)</chem><math>\quad \Delta H = -1368 \, \mathrm{kJ}</math>・・・①
:<chem>C(graphite) + O2(g) -> CO2(g)</chem><math>\quad \Delta H = -394 \, \mathrm{kJ}</math>・・・②
:<chem>H2(g) + 1/2 O2(g) -> H2O(l)</chem><math>\quad \Delta H = -286 \, \mathrm{kJ}</math>・・・③
求める反応は
:<chem>2C(graphite) + 3H2(g) + 1/2 O2(g) -> C2H5OH(l)</chem>
であり、これは <math>2 \times \text{②} + 3 \times \text{③} - \text{①}</math> で得られる。したがって、
:<math>\Delta H = 2 \times (-394) + 3 \times (-286) - (-1368) = -278\ \mathrm{kJ}</math>
となり、エタノールの生成エンタルピーは <math>-278\ \mathrm{kJ/mol}</math> である。
{{証明終わり}}
;応用2:エンタルピー図の利用
[[File:ヘスの法則svg.svg|thumb|250px|<chem>H2O</chem> の凝縮エンタルピーを求める。]]
<!-- 縦軸は本来「エンタルピー」にするべきだが、良い画像がなかったので旧課程版の画像を流用している。 -->
エンタルピー変化を表した図を'''エンタルピー図'''という。
エンタルピー図を利用すると、未知の反応エンタルピーを視覚的に求められる。25 ℃ での水素の燃焼について、次の二つの反応エンタルピーがわかっているとする。
:<chem>H2(g) + 1/2 O2(g) -> H2O(l)</chem><math>\quad \Delta H = -286 \, \mathrm{kJ}</math>
:<chem>H2(g) + 1/2 O2(g) -> H2O(g)</chem><math>\quad \Delta H = -242 \, \mathrm{kJ}</math>
右のエンタルピー図から、水の凝縮エンタルピー <math>Q</math> は
:<math>Q = -286 - (-242) = -44\ \mathrm{kJ/mol}</math>
と求まる。
なお、単体や完全燃焼生成物を基準にするとエンタルピー図を書きやすいが、'''燃焼生成物は低エンタルピー、単体は高エンタルピーとなることが多い'''。
;応用3:生成エンタルピーと反応エンタルピーの関係
エンタルピー図を書くことによって、次の関係がわかる。
:'''反応エンタルピー''' = ('''生成物'''の生成エンタルピーの総和)− ('''反応物'''の生成エンタルピーの総和)
この関係を利用して、反応エンタルピーを求めることもできる。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題2 生成エンタルピーと燃焼エンタルピー'''
|-
|style="padding:5px"|
メタン <chem>CH4</chem>、二酸化炭素 <chem>CO2</chem>、液体の水 <chem>H2O</chem> の生成エンタルピーを、それぞれ <math>-75\ \mathrm{kJ/mol}</math>、<math>-394\ \mathrm{kJ/mol}</math>、<math>-286\ \mathrm{kJ/mol}</math> として、メタンの燃焼エンタルピーを求めよ。
|}
{{解答|例題2の解答}}
メタンの燃焼を表す反応式は、次のとおりである。
:<chem>CH4(g) + 2O2(g) -> CO2(g) + 2H2O(l)</chem>
単体 <chem>O2</chem> の生成エンタルピーは 0 であるから、
:<math>\Delta H = \{(-394) + 2 \times (-286)\} - (-75) = -891\ \mathrm{kJ}</math>
となる。
{{証明終わり}}
;応用4:結合エンタルピー
分子内の 1 mol の'''共有結合'''を切断して、気体状の原子にするために必要なエネルギーを、その共有結合の'''結合エンタルピー'''([[高等学校物理/原子物理#原子核反応|結合エネルギー]])という。結合を切断するためにエネルギーが必要になるので、<math>\Delta H</math> は必ず'''正'''である。
:例)<chem>H-H(g) -> 2H(g)</chem><math>\quad \Delta H = 436 \, \mathrm{kJ}</math>
※ <chem>H-H</chem> は <chem>H2</chem> のままで書いてもよい。
エンタルピー図を書くことによって、次の関係がわかる。
:'''反応エンタルピー''' = ('''反応物'''の結合エンタルピーの総和)− ('''生成物'''の結合エンタルピーの総和)
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題3 結合エンタルピーと反応エンタルピー'''
|-
|style="padding:5px"|
結合エンタルピーを <chem>H-H</chem> 436 kJ/mol、<chem>Cl-Cl</chem> 243 kJ/mol、<chem>H-Cl</chem> 432 kJ/mol として、次の反応の反応エンタルピーを求めよ。
:<chem>H2(g) + Cl2(g) -> 2HCl(g)</chem>
|}
{{解答|例題3の解答}}
切断される結合は <chem>H-H</chem> 1 mol と <chem>Cl-Cl</chem> 1 mol、生成する結合は <chem>H-Cl</chem> 2 mol である。
:<math>\Delta H = (436 + 243) - 2 \times 432 = -185\ \mathrm{kJ}</math>
となる。
{{証明終わり}}
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題4 結合エンタルピーと生成エンタルピー'''
|-
|style="padding:5px"|
結合エンタルピーを <chem>H-H</chem> 436 kJ/mol、<chem>O=O</chem> 498 kJ/mol、<chem>O-H</chem> 463 kJ/mol として、水蒸気の生成エンタルピーを求めよ。
|}
{{解答|例題4の解答}}
次の反応で考える。
:<chem>2H2(g) + O2(g) -> 2H2O(g)</chem>
切断される結合は <chem>H-H</chem> 2 mol と <chem>O=O</chem> 1 mol、生成する結合は <chem>O-H</chem> 4 mol である(<chem>H2O</chem> 1分子に <chem>O-H</chem> 結合は2本ある)。
:<math>\Delta H = (2 \times 436 + 498) - 4 \times 463 = -482\ \mathrm{kJ}</math>
これは <chem>H2O(g)</chem> 2 mol あたりの値であるから、生成エンタルピーは <math>\dfrac{-482}{2} = -241\ \mathrm{kJ/mol}</math> である。
{{証明終わり}}
結合エンタルピーは気体の分子について定められているので、この方法で求められるのは、反応物と生成物がすべて気体の場合の反応エンタルピーである。液体の水の生成エンタルピーを求めるには、さらに凝縮エンタルピーを考える必要がある。
;応用5:格子エンタルピー(発展)
イオン結晶 1 mol のイオン結合を切断して気体状のイオンにするのに必要なエネルギーを、そのイオン結合の'''格子エンタルピー'''(格子エネルギー)という。格子エンタルピーは、そのイオン結晶が安定かどうかの指標になる。
格子エンタルピーを直接測定することはできないが、ヘスの法則を利用して、間接的に求められる。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題5 格子エンタルピー'''
|-
|style="padding:5px"|
<chem>NaCl(s)</chem> の生成エンタルピーを <math>-411\ \mathrm{kJ/mol}</math>、<chem>Na(s)</chem> の昇華エンタルピーを <math>92\ \mathrm{kJ/mol}</math>、<chem>Cl2</chem> の結合エンタルピーを <math>243\ \mathrm{kJ/mol}</math>、<chem>Na(g)</chem> のイオン化エネルギーを <math>496\ \mathrm{kJ/mol}</math>、<chem>Cl(g)</chem> の電子親和力に対応する反応エンタルピーを <math>-349\ \mathrm{kJ/mol}</math> とする。<chem>NaCl(s)</chem> の格子エンタルピー <math>Q\ \mathrm{[kJ/mol]}</math> を求めよ。
|}
{{解答|例題5の解答}}
それぞれの反応エンタルピーを付した反応式は、次のようになる。
:①<chem>Na(s) + 1/2 Cl2(g) -> NaCl(s)</chem><math>\quad \Delta H = -411 \, \mathrm{kJ}</math>
:②<chem>Na(s) -> Na(g)</chem><math>\quad \Delta H = 92 \, \mathrm{kJ}</math>
:③<chem>Cl2(g) -> 2Cl(g)</chem><math>\quad \Delta H = 243 \, \mathrm{kJ}</math>
:④<chem>Na(g) -> Na+(g) + e-</chem><math>\quad \Delta H = 496 \, \mathrm{kJ}</math>
:⑤<chem>Cl(g) + e- -> Cl-(g)</chem><math>\quad \Delta H = -349 \, \mathrm{kJ}</math>
:⑥<chem>NaCl(s) -> Na+(g) + Cl-(g)</chem><math>\quad \Delta H = Q \, \mathrm{kJ}</math>
エンタルピー図を書くと、ヘスの法則より <math>-\text{①} + \text{②} + \dfrac{1}{2}\,\text{③} + \text{④} + \text{⑤} = \text{⑥}</math> がわかる。
<math>\Delta H</math> の値だけに着目して計算すると、
:<math>Q = 411 + 92 + \dfrac{243}{2} + 496 - 349 = 771.5</math>
となる。有効数字を考慮すると、<math>Q = 772\ \mathrm{kJ/mol}</math> と求まる。
{{証明終わり}}
;反応エンタルピーの測定
反応エンタルピーは、反応による熱の吸収・放出を測定することにより求められる。測定には、水温の変化を利用する。
水溶液の質量を <math>m\ \mathrm{[g]}</math>、温度変化を <math>\Delta T\ \mathrm{[K]}</math>、比熱を <math>c\ \mathrm{[J/(g \cdot K)]}</math> とすると、発熱量(吸熱量)<math>Q</math> は <math>Q = mc \Delta T</math> である。反応エンタルピーの'''絶対値'''は、<math>Q</math> を物質量で割れば求まる。反応エンタルピーの符号は、発熱反応か吸熱反応かで判断する。
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題6 溶解エンタルピーの測定'''
|-
|style="padding:5px"|
水 98 g に水酸化ナトリウム <chem>NaOH</chem>(式量 40)2.0 g を溶かしたところ、水溶液の温度が 5.3 K 上昇した。<chem>NaOH</chem> の溶解エンタルピーを求めよ。ただし、水溶液の比熱を <math>4.18\ \mathrm{J/(g \cdot K)}</math> とし、熱は水溶液の温度上昇にのみ使われたものとする。
|}
{{解答|例題6の解答}}
水溶液の質量は <math>98 + 2.0 = 100\ \mathrm{g}</math> である。発熱量は
:<math>Q = 100 \times 4.18 \times 5.3 \approx 2.2 \times 10^{3}\ \mathrm{J} = 2.2\ \mathrm{kJ}</math>
<chem>NaOH</chem> の物質量は <math>\dfrac{2.0}{40} = 0.050\ \mathrm{mol}</math> であるから、1 mol あたりの発熱量は <math>\dfrac{2.2}{0.050} \approx 44\ \mathrm{kJ}</math> である。発熱反応であるから、<math>\Delta H = -44\ \mathrm{kJ/mol}</math> となる。
{{証明終わり}}
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題7 中和エンタルピーの測定'''
|-
|style="padding:5px"|
1.0 mol/L の塩酸 50 mL と 1.0 mol/L の水酸化ナトリウム水溶液 50 mL を混合したところ、水溶液の温度が 6.7 K 上昇した。中和エンタルピーを求めよ。ただし、水溶液の密度を <math>1.0\ \mathrm{g/cm^3}</math>、比熱を <math>4.2\ \mathrm{J/(g \cdot K)}</math> とし、熱は水溶液の温度上昇にのみ使われたものとする。
|}
{{解答|例題7の解答}}
水溶液の質量は <math>100\ \mathrm{cm^3} \times 1.0\ \mathrm{g/cm^3} = 100\ \mathrm{g}</math> である。発熱量は
:<math>Q = 100 \times 4.2 \times 6.7 \approx 2.8 \times 10^{3}\ \mathrm{J}</math>
生成した水の物質量は <math>1.0 \times \dfrac{50}{1000} = 0.050\ \mathrm{mol}</math> であるから、水 1 mol あたりの発熱量は <math>\dfrac{2.814\ \mathrm{kJ}}{0.050\ \mathrm{mol}} \approx 56\ \mathrm{kJ/mol}</math> である。発熱反応であるから、中和エンタルピーは <math>\Delta H = -56\ \mathrm{kJ/mol}</math> となる。
{{証明終わり}}
実際の測定では、容器や温度計にも熱が逃げ、温度が最高に達するまでにも熱が失われる。そのため、温度の時間変化をグラフにし、冷却の直線を混合した時刻まで延長して、熱の損失がなかった場合の温度上昇を求める。
==化学反応が自発的に進む要因==
; エントロピー
一般に、物質はエンタルピーが低い方が安定なので、発熱反応では反応が自発的に進みやすい。しかし、エンタルピーが高くなる反応であるにもかかわらず、自発的に進む吸熱反応は、身の回りに数多くある。氷の融解がその代表例である。
このように、エンタルピーだけでは、反応が自発的に進むかどうかを判断できない。そこで、次のような量を考える。
系の状態によって決まる量 <math>S</math> を'''エントロピー'''(熵)という。温度 <math>T</math> の系が、可逆的に熱 <math>Q</math> を受け取ったとき、エントロピーの変化量は <math>\Delta S = \dfrac{Q}{T}</math> である。単位はジュール毎ケルビン(J/K)である。
エントロピーは'''系の乱雑さを表す物理量'''であり、可逆変化では、系と外界を合わせた全体のエントロピーは変化しない。
熱力学第二法則より、熱は高温物体から低温物体に伝わっていく。この過程では、全体のエントロピーが増大する。一般に、孤立系で不可逆変化が生じた場合、その系のエントロピーは増大する。これを'''エントロピー増大則'''という。たとえば、溶解や拡散のように、物質が広がっていく変化は、エントロピーが増大する変化である。
これを踏まえると、化学反応が自発的に進むかどうかは、「エンタルピー変化による安定化の度合い」と「エントロピー変化による乱雑さ増大の度合い」のかね合いで判断できる。
; ギブスの自由エネルギー
系の乱雑さが増大する度合いは、熱運動が激しいほど大きくなる。そのため、乱雑さによる安定化は、エントロピーと絶対温度の積 <math>TS</math> で表される。
そこで、乱雑さとエンタルピーによる安定化を同時に考えるため、次のような量を導入する。
系のエンタルピーを <math>H</math>、系のエントロピーを <math>S</math>、系の絶対温度を <math>T</math> としたとき、<math>G = H - TS</math> を'''ギブスの自由エネルギー'''という。単位はジュール(J)である。
<math>H</math> が小さいほど安定、<math>S</math> が大きいほど安定なので、<math>G</math> が小さいほど安定である。したがって、温度と圧力が一定のとき、自由エネルギー変化 <math>\Delta G = \Delta H - T \Delta S</math> が'''負'''ならば、安定な方向に反応が進むので、自発的に反応する。<math>\Delta G</math> が 0 ならば、化学平衡の状態にある。<math>\Delta G</math> が'''正'''ならば、自発的には反応せず、逆反応が進む。なお、エンタルピー変化もエントロピー変化も負ならば低温条件で、ともに正ならば高温条件で、反応が進行する。
エンタルピー変化を付した反応式の上では成り立っても現実に起こらない反応があるのは、その反応で自由エネルギー変化が負にならないためである。
<math>\Delta H</math> と <math>\Delta S</math> の符号と、反応が自発的に進む条件の関係は、次のようにまとめられる。
{| class="wikitable"
! <math>\Delta H</math> !! <math>\Delta S</math> !! <math>\Delta G = \Delta H - T \Delta S</math> !! 自発的に進む条件
|-
| 負 || 正 || つねに負 || すべての温度
|-
| 負 || 負 || 低温で負 || 低温
|-
| 正 || 正 || 高温で負 || 高温
|-
| 正 || 負 || つねに正 || 自発的には進まない
|}
{| style="border:2px solid aqua;width:80%" cellspacing=0
|style="background:aqua"|'''例題8 自由エネルギーと氷の融解(発展)'''
|-
|style="padding:5px"|
0 ℃(273 K)での氷の融解エンタルピーを <math>6.01\ \mathrm{kJ/mol}</math>、融解に伴うエントロピー変化を <math>22.0\ \mathrm{J/(mol \cdot K)}</math> とする。<math>\Delta H</math> と <math>\Delta S</math> が温度によらず一定として、−10 ℃(263 K)と 10 ℃(283 K)で、氷が自発的に融解するかどうかを判断せよ。
|}
{{解答|例題8の解答}}
1 mol あたりの <math>\Delta G = \Delta H - T \Delta S</math> を求める。
:263 K:<math>\Delta G = 6.01 - 263 \times 0.0220 \approx +0.22\ \mathrm{kJ}</math>
:283 K:<math>\Delta G = 6.01 - 283 \times 0.0220 \approx -0.22\ \mathrm{kJ}</math>
したがって、−10 ℃ では <math>\Delta G > 0</math> であるから氷は自発的には融解せず、10 ℃ では <math>\Delta G < 0</math> であるから自発的に融解する。なお、<math>\Delta G = 0</math> となる温度は <math>T = \dfrac{6010}{22.0} \approx 273\ \mathrm{K}</math> であり、これが融点である。
{{証明終わり}}
;補足:熱力学第三法則
絶対零度では、完全結晶(原子の欠落や不純物のない結晶)のとりうる配置は1通りなので、エントロピーは 0 と考えられる。したがって、次の'''熱力学第三法則'''が成り立つ。
:完全結晶のエントロピーは、絶対零度では、すべて等しい。
この法則は、「有限回の操作では絶対零度に到達できない」という原理と密接に関係している。
熱力学は、第零法則(「物体 A と B、B と C がそれぞれ熱平衡ならば、A と C も熱平衡にある」という法則)、第一法則、第二法則に、この第三法則を加えて体系が整う。
==化学反応と光==
光は電磁波の一種であり、波長の長いほうから、電波、赤外線、可視光線、紫外線、X線、γ線に分けられる。波長が短いほどエネルギーは大きくなる([[高等学校物理/原子物理#光の粒子性]]を参照)。
なお、虹の七色は'''{{ruby|赤橙黄緑青藍紫|せきとうおうりょくせいらんし}}'''である。
;化学発光
反応物と生成物のエネルギーの差を、光エネルギーとして放出する反応を'''化学発光'''('''化学冷光'''、'''化学ルミネセンス''')という。
*ルミノール反応
塩基性条件下で'''ルミノール'''(<chem>C8H7N3O2</chem>)を過酸化水素などで酸化すると、青く発光する。遷移元素の錯体が存在すると強く反応するため、血液の検出に用いられる。
*蛍光物質
'''蓚酸ジフェニル'''(<chem>C14H10O4</chem>)は、過酸化水素と反応して生じる中間体が、エネルギーを'''蛍光物質'''に与えて発光させる。ケミカルライトに用いられる。
なお、炎色反応は、炎の熱によってエネルギーの高い状態になった原子が光を放出する現象であり、化学反応のエネルギーによる化学発光とは区別される。ホタルやクラゲなど、生物による化学発光は'''生物発光'''という。([[高等学校 生物/効果器]]も参照。)
;光化学反応
化学反応を起こさせるのは、熱だけではない。可視光線や紫外線などの吸収により起こったり、促進されたりする反応を'''光化学反応'''という。
*ハロゲン化銀の感光
[[高校化学 ハロゲン#ハロゲン化銀・ハロゲン化鉛|ハロゲン化銀]]は、光に当てると銀を遊離する('''感光性''')。歴史的には、臭化銀 <chem>AgBr</chem>が写真に用いられ、有名人の写真を意味する「ブロマイド」の語源となっている。
*水素と塩素の爆発
水素と塩素の混合気体に強い光を当てると、爆発的に反応して塩化水素を生じる。
:<chem>H2 + Cl2 -> 2HCl</chem>
*ベンゼンの付加反応
[[高校化学 芳香族化合物#ベンゼン|ベンゼン]] <chem>C6H6</chem> は付加反応が起こりにくいが、紫外線を照射すると、塩素が付加して、ヘキサクロロシクロヘキサン <chem>C6H6Cl6</chem> を生じる。
*光触媒
光が当たると触媒の働きを示す物質を'''光触媒'''という。たとえば、'''チタニア'''('''酸化チタン(Ⅳ)''')<chem>TiO2</chem> に酢酸などの有機化合物が付着した状態で光を当てると、有機化合物が二酸化炭素と水に分解される。チタニアは、家屋の外壁などに用いられている。
*光合成
植物は光エネルギーを利用して、二酸化炭素と水から'''グルコース'''('''葡萄糖''')<chem>C6H12O6</chem> を合成する。この反応は、
:<chem>6CO2(g) + 12H2O(l) -> C6H12O6(s) + 6O2(g) + 6H2O(l)</chem><math>\quad \Delta H = 2803 \, \mathrm{kJ}</math>
と書き表される。多数のグルコースが連なって[[高校化学 天然高分子化合物|高分子化合物]]を形成すると、'''澱粉'''となる。([[高等学校 生物/光合成]]も参照)
日焼けや、プラスチックごみの分解によるマイクロプラスチックの発生も、光化学反応によるものである。
==補足:熱化学方程式==
2022年度以前の課程では、長らくエンタルピーではなく'''熱化学方程式'''('''熱化学反応式''')が用いられていた。
熱化学方程式では、化学反応式中に等号『=』を用いるほか、熱量を反応式に足して記していた。
例えば、光合成の反応は熱化学方程式では以下のように書き表される。
:<chem>6CO2(g) + 12H2O(l) + 668 kcal = C6H12O6(s) + 6O2(g) + 6H2O(l)</chem> ※1 kcal = 4184 J
ここで、エンタルピー変化を付した反応式とは'''熱量の符号が逆'''になっていることがわかる。これは、エンタルピー変化を付した反応式では'''系の物質の視点'''に立っているのに対して、熱化学方程式は'''外界の観察者の視点'''に立っているためである。
よって、2022年度施行課程以前の教科書・参考書を使用する際は注意が必要である。
熱化学方程式が廃止された理由としては、熱化学方程式は『日本の高校でしか通用しない概念』であったことが挙げられる。大学や海外ではエンタルピーを用いるのが普通なので、そこで熱化学を学習すると先述の通り熱量の符号が逆転してしまい、学習者に大きな混乱を与えていた。また、化学の様々な分野がある中で反応式中に『=』が登場するのは熱化学方程式だけであったので、他の分野との整合が取れていなかったのも一因と考えられる。
*参考文献:数研出版特集『[https://www.chart.co.jp/subject/rika/scnet/76/Snet76-2.pdf 「反応熱」から「反応エンタルピー」へ]』
{{DEFAULTSORT:かかくはんのうとえんたるひ}}
[[Category:高等学校化学]]
[[カテゴリ:化学反応]]
[[カテゴリ:エネルギー]]
qxz5e34167vihw2u06nk33gg38fvpe2
コンピュータセキュリティ
0
48948
304703
304700
2026-10-14T12:11:39Z
~2026-54076-02
92740
/* 潜在的な脆弱性を減らす */
304703
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w: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 を有効にしているかは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r)
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 関数が用意されています。
=== 制御フロー操作を防ぐ ===
現代では[[:w:Return-oriented programming|リターン指向プログラミング]] (ROP)、呼び出し指向プログラミング (COP)、ジャンプ指向プログラミング (JOP) などの制御フロー操作による攻撃が一般化しています。
現在の CPU が IBT / Shadown Stack を有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
現在のLinuxカーネルが IBT / Shadown Stack を有効にしているかは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で IBT または Shadown Stack を無効にしているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find /usr -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
b6r8b8febfdycwetedz5a7769wsoy2b
304704
304703
2026-10-14T12:39:20Z
~2026-54076-02
92740
/* 潜在的な脆弱性を減らす */
304704
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フロー操作を防ぐ ===
現代では[[:w:Return-oriented programming|リターン指向プログラミング]] (ROP)、呼び出し指向プログラミング (COP)、ジャンプ指向プログラミング (JOP) などの制御フロー操作による攻撃が一般化しています。これを防ぐ技術として[[:w:en:Indirect branch tracking|間接分岐追跡]] (IBT) と[[:w:en:Shadow stack|シャドウスタック]] (SHSTK) が存在します。
現在の CPU が IBT / シャドウスタックを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
現在のLinuxカーネルが IBT / シャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で IBT またはシャドウスタックを無効にしているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find /usr -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
eudv0atdia2shvq2kqzdafo9oukhho9
304705
304704
2026-10-14T12:42:23Z
~2026-54076-02
92740
/* 制御フロー操作を防ぐ */
304705
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フロー操作を防ぐ ===
現代では[[:w:Return-oriented programming|リターン指向プログラミング]] (ROP)、呼び出し指向プログラミング (COP)、ジャンプ指向プログラミング (JOP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の[[:w:en:Indirect branch tracking|間接分岐追跡]] (IBT) と[[:w:en:Shadow stack|シャドウスタック]] (SHSTK) が存在します。
現在の CPU が IBT / シャドウスタックを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
現在のLinuxカーネルが IBT / シャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で IBT またはシャドウスタックを無効にしているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find /usr -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
ms059uciy8gnii4ieb8nuzetuhmsi96
304706
304705
2026-10-14T13:02:18Z
~2026-54076-02
92740
/* 制御フロー操作を防ぐ */
304706
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フロー操作を防ぐ ===
現代では[[:w:Return-oriented programming|リターン指向プログラミング]] (ROP)、呼び出し指向プログラミング (COP)、ジャンプ指向プログラミング (JOP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[: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カーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find /usr -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
0xyj7w2wp7q1kpuazwmn34fqqpsph0a
304707
304706
2026-10-14T13:27:12Z
~2026-54076-02
92740
/* 制御フロー操作を防ぐ */
304707
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フロー操作を防ぐ ===
現代では[[:w:Return-oriented programming|リターン指向プログラミング]] (ROP)、呼び出し指向プログラミング (COP)、ジャンプ指向プログラミング (JOP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[: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 以降対応)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>でシャドウスタックが有効となっています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
k3rxvzvclpdxvlj3r6skbt3d2xg5jh6
304709
304707
2026-10-14T14:00:54Z
~2026-54076-02
92740
304709
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フロー操作を防ぐ ===
現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。
制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます:
* Intel Core (Tiger Lake) 第11世代以降
* AMD Zen 3 以降(シャドウスタックのみ)
現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
894ktmghfjowvg5x2q287mkyr1afhl4
304712
304709
2026-10-14T15:28:18Z
~2026-54076-02
92740
/* 制御フロー操作を防ぐ */
304712
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フローの操作を防ぐ ===
現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。
制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます:
* Intel Core (Tiger Lake) 第11世代以降
* AMD Zen 3 以降(シャドウスタックのみ)
現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても悪意のある関数冒頭の呼び出しは防げません。これには例えば関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のカスタムシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。
また例外処理に使われる巻き戻し情報(アンワインドデータ)を改ざんして独自のコードを呼び出す「Bring Your Own Unwind Data」(BYOUD) という攻撃手法も登場しています。
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
r65g26nma4cnx3odn7a4lu85yegfmur
304713
304712
2026-10-14T15:34:48Z
~2026-54076-02
92740
304713
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フローの操作を防ぐ ===
現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。
制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます:
* Intel Core (Tiger Lake) 第11世代以降
* AMD Zen 3 以降(シャドウスタックのみ)
現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。これには例えば関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のカスタムシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。
また例外処理に使われる巻き戻し情報(アンワインドデータ)を改ざんして独自のコードを呼び出す「Bring Your Own Unwind Data」(BYOUD) という攻撃手法も登場しています。
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
oiqe5zs5cadky8km4iir741pirb5wyn
304714
304713
2026-10-14T16:09:55Z
~2026-54076-02
92740
/* 制御フローの操作を防ぐ */
304714
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フローの操作を防ぐ ===
現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。
制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます:
* Intel Core (Tiger Lake) 第11世代以降
* AMD Zen 3 以降(シャドウスタックのみ)
現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また関数の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) という手法も存在します。
またC++向けでは仮想関数テーブル (vtable) を改ざんして仮想関数ガジェット (vfgadget) を呼び出す「Counterfeit Object-oriented Programming」(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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
b575fshoab0tuilnyf8z210ze1k8xcd
304715
304714
2026-10-14T16:11:44Z
~2026-54076-02
92740
/* 制御フローの操作を防ぐ */
304715
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フローの操作を防ぐ ===
現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。
制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます:
* Intel Core (Tiger Lake) 第11世代以降
* AMD Zen 3 以降(シャドウスタックのみ)
現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また関数の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) という手法も存在します。
また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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
rxdj9vmjtovumo37jx0mw97mdrl1czs
304716
304715
2026-10-14T16:18:29Z
~2026-54076-02
92740
304716
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フローの操作を防ぐ ===
現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。
制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます:
* Intel Core (Tiger Lake) 第11世代以降
* AMD Zen 3 以降(シャドウスタックのみ)
現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また関数の通常呼び出しだけで攻撃する「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'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
449lur0f18w6q3toi36chux888fbsrw
304726
304716
2026-10-15T03:27:29Z
~2026-54076-02
92740
304726
wikitext
text/x-wiki
'''コンピュータセキュリティ'''はコンピュータの安全のことです。ここではコンピュータの安全を確保することを学びます。
== コンピュータセキュリティの基本 ==
コンピュータは弱いところから狙われるため、弱いところを無くすのがセキュリティの基本となります。
具体例を挙げましょう。一般的な光回線に繋がれてるホームネットワークを考えます。ここには光回線の先に繋がる上位ネットワークと家内のホームネットワーク (家庭におけるLAN) とを区切るエッジルーター(一般的にはハードウェア・ゲートウェイがこれに該当)が存在します。このホームネットワークに数台の新しいWindows PCと一台の古い機器が繋がっていると仮定します。
新しいWindows PC同士ではホームネットワーク経由でファイルをやり取りするためにファイルの共有 (SMB{{efn|Server Message Block}}) を有効にしているとします。一方、古い機器の方を脆弱性のある古いテレビとしましょう。このテレビはインターネットから繋いで地上デジタル放送を見るための DCTP+ {{efn|Digital Transmission Content Protection +}}が搭載されており、UPnP{{efn|Universal Plug and Play}}で自動的にエッジルーター搭載のファイアーウォールに穴あけてインターネット側から DCTP+ に繋がるようになっているものとします。
この仮定によってハッカーは DCTP+ の脆弱性を使って古いテレビに悪意のあるプログラムを実行させてファイルの共有サーバーを立て{{efn|Windows 11時点でもゲスト認証による接続は許可されている<ref>[https://learn.microsoft.com/en-us/windows-server/storage/file-server/smb-interception-defense?tabs=group-policy Protect SMB traffic from interception] Microsoft</ref>。}}、そこからファイルの共有を通じて新しいWindows PCにマルウェア (例えば<code>PHOTO-<ランダムな数字>.png.lnk</code><ref>[https://www.microsoft.com/en-us/security/blog/2026/06/25/photo-zip-campaign-targeting-hospitality-industry-delivers-node-js-implant-persistent-access/ Photo ZIP campaign targeting hospitality industry delivers Node.js implant for persistent access] Microsoft 2026年6月25日</ref>) を送り込むことが可能となりました。
== 安全にパスワードを使う ==
<!--
=== パスワードの複雑性をチェックする ===
-->
=== 流出パスワードと被ってないかをチェックする ===
あちこちのサイトで流出したパスワードは集められてデータベース化されダークネットに流通しています。この代表的なものには2019年に登場した [[:w:en:Collection No. 1|Collection #1]] が挙げられます。この Collection #1 などの流出パスワードデータベースは辞書攻撃に利用されており、これは「Credential Stuffing攻撃」と呼ばれています。
使うパスワードが流出パスワードデータベースに載っていないかを確認するためには上記のデータベースを手に入れるか、上記のデータベースからk-匿名性で検索を行うオンラインサービスを使うと良いでしょう。このオンラインサービスの代表的なものにはWebサイト「Have I Been Pwned」の提供する「Pwned Passwords」サービスが存在しますが、このAPIではパスワードのSHA-1ハッシュ先頭5文字を渡すと、流出したパスワードのSHA1ハッシュ6文字以降と流出データベースに載っていた回数が返答されます。
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ # パスワードを入力してSHA-1ハッシュへと変換する(ここでは'test'と入力)
$ sha1=$(read -sp "Password: " pass && echo -n $pass | sha1sum | cut -d' ' -f1)
Password:
$ # 変換後のハッシュを表示
$ echo $sha1
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
$ # ハッシュの先頭5文字を渡して6文字目以降を検索(':'の後ろは見つかった数)
$ curl -s https://api.pwnedpasswords.com/range/$(echo $sha1 | cut -c 1-5) | grep -i $(echo $sha1 | cut -c 6-)
FE5CCB19BA61C4C0873D391E987982FBBD3:1579235
</syntaxhighlight>
<!--
=== TPMで鍵を隔離する ===
-->
== 既製製品の脆弱性を塞ぐ ==
まずは弱いところを無くしましょう。
=== ソフトウェアアップデートをする ===
セキュリティの基本はソフトウェアアップデートです。
==== PCおよびモバイル ====
PC{{efn|PCサーバを含む}}やモバイルでは基本的に自動で通知が来るので忘れずにアップデートを選択しましょう。手動では以下のように行います:
; Windows
: システムのアップデートは基本的に [[:w:Microsoft Update|Microsoft Update]] (Windows Update) で、アプリケーションのアップデートは基本的に<code>winget upgrade</code>コマンドで行います。
: また Windows 11 Enterprise では再起動が不要なホットパッチにも対応しています。
; macOS / iOS
: 「ソフトウェアアップデート」
; Ubuntu / Debian
: [[:w:APT|APT]]パッケージ管理システムでは<code>apt upgrade</code>コマンドで更新を行います。
: Ubuntu では GUI による更新用として[[:w:Software Updater|Software Updater]] (<code>update-manager</code>コマンド)、[[:w:Snap (ソフトウェア)|Snap]]パッケージの更新コマンドとして<code>snap refresh</code>、メジャーバージョンの更新コマンドとして<code>do-release-upgrade</code>も存在します。
: また Ubuntu では Ubuntu Pro に登録することで再起動が不要なカーネル修正の「Livepatch」も可能となります(個人では5台まで無料)。SUSEではユーザー空間ライブパッチングまで提供されています(glibc と openssl のみ)<ref>[https://documentation.suse.com/ja-jp/sles/15-SP6/html/SLES-all/cha-ulp.html ユーザ空間ライブパッチ - 管理ガイド - SLES 15 SP6] SUSE</ref>。
; RedHat / Fedora
: <code>yum update</code>コマンド
; Android
: 「設定」アプリ→「システム」→「システムアップデート」または「ソフトウェアアップデート」
また個々のハードウェアのファームウェアアップデートは以下で行います:
; Linux
: Linuxにおけるファームウェアの更新は基本的に<code>fwupdmgr update</code>コマンドで行います。
: NVMe SSDのファームウェアの更新は<code>nvme fw-download</code>コマンドおよび<code>nvme fw-commit</code>コマンドで行うことができます。
一方、Windows ではファームウェアのアップデートも Windows Update 経由で<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/bringup/firmware-update ファームウェアの更新] Microsoft</ref>、macOS ではファームウェアのアップデートもmacOSアップデートで行うことができます<ref>[https://support.apple.com/ja-jp/guide/mac-help/mchlp2609/mac Macのファームウェアアップデートの入手方法] Apple</ref>。
<!--
また開発環境では以下も存在します:
; Python
: <code>pip -U install</code>
-->
==== ルーター ====
ルーターでは以下の設定を有効のままにしておきましょう:
; AirStationシリーズ(Buffalo 製ルーター)
: 「ファームウェア自動更新機能」
; Atermシリーズ(NEC 製ルーター)
: 「メンテナンスバージョンアップ機能」「時刻指定バージョンアップ機能」
==== テレビ ====
テレビでは放送波アップデートが行われるため、「放送波による自動更新」<!--TODO: メーカー別名-->を有効にしましょう。
=== 高速に再起動する ===
パッケージは更新しただけでは反映されません(一部デーモンの更新を除く)。Linuxでは高速に再起動する方法が存在し、これによってダウンタイムを減らすことができます。
; 更新で影響を受けるデーモンのみ再起動する
:* Ubuntu Server: 標準で <code>needrestart</code> が導入されており自動で影響を受けるデーモンの再起動が行われます{{efn|自動的なデーモン再起動を止めるには /etc/apt/apt.conf.d/99needrestart より<code>-m u</code>を削除する必要があります<ref>[https://discourse.ubuntu.com/t/needrestart-changes-in-ubuntu-24-04-service-restarts/44671 `needrestart` changes in Ubuntu 24.04: service restarts] Canonical 2024年</ref>。}}(Ubuntu Desktopでは別途導入が必要)。
:* RedHat / Fedora: <code>dnf needs-restarting</code>が導入されており、それによって再起動するべきデーモンを確認できます。
; ユーザー空間のみ再起動する(カーネルの更新がない、またはカーネルでlive patchingを行ってる場合)
: <code>sudo systemctl soft-reboot</code>
; 高速にカーネルを更新する(ファームウェアの更新がない場合)
: <code>sudo systemctl kexec</code>
また一部のソフトウェアではホットアップグレード(無停止アップグレード{{efn|Zero-Downtime Upgrade}})にも対応しています (nginx の USR2 シグナル<ref>[https://nginx.org/en/docs/control.html Controlling nginx] nginx</ref>など)。
=== 代替ソフトウェアを探す ===
更新が停止された古いソフトウェアの多くはそれ自身に脆弱性が存在したり、脆弱性のある古いライブラリに依存していたりします。そのため古いソフトウェアは速やかに代替ソフトウェアへと移行しましょう。
==== 開発終了したソフトウェアから現役のソフトウェアへ ====
古いソフトウェアには例えば以下があります:
* オフィススイート(代替候補: LibreOffice)
** [[:w:OpenOffice.org|OpenOffice.org]](〜2011年)
* 画像ビューア
** [[:w:Susie|Susie]] (〜2013年)
* メディアプレイヤー
** [[:w:QuickTime|QuickTime]] for Windows(〜2016年) - リモートコード実行の脆弱性 ([https://www.zerodayinitiative.com/advisories/ZDI-16-241/ ZDI-16-241]、[https://www.zerodayinitiative.com/advisories/ZDI-16-242/ ZDI-16-242]) を残したままサポート終了しました<ref>[https://internet.watch.impress.co.jp/docs/news/753400.html Apple、「QuickTime for Windows」のサポートを終了、アンインストールを推奨] Impress 2016年4月15日</ref>。
* メディアフィルター(代替候補: LAV Filters)
** [[:w:ffdshow|ffdshow]](〜2014年)
** [[:w:Haali Media Splitter|Haali Media Splitter]](〜2013年)
* メディアセンター(代替候補: Kodi)
** [[:w:en:Boxee|Boxee]](〜2011年)
** [[:w:Kodi|XBMC]](〜2014年) - Kodiの前身
* 圧縮ソフトウェア
** [[:w:+Lhaca|+Lhaca]](〜2007年)
** [[:w:Lhaplus|Lhaplus]](〜2017年)
またハードウェアに由来する古いソフトウェアには例えば以下があります:
* [[w:ウォークマン|ウォークマン]]関連(代替候補: [[:w:Music Center for PC|Music Center for PC]])
** [[:w:CONNECT Player|CONNECT Player]](〜2007年、Sony)
** [[:w:SonicStage|SonicStage]](〜2009年、Sony)
** [[:w:x-アプリ|x-アプリ]](〜2016年、Sony)
* DTCP-IP関連
** SmartVision/PLAYER powered by DiXiM(〜2019年、NEC)<ref>[https://support.nec-lavie.jp/navigate/support/info/2019/announce/svp/ SmartVision/PLAYER保守サービス終了のお知らせ] NECパーソナルコンピュータ 2019年1月28日</ref><ref>[https://apps.microsoft.com/detail/9wzdncrdkb4c?hl=ja-JP&gl=JP SmartVision/PLAYER powered by DiXiM] Microsoft</ref>
** DiXiM Digital TV plus for I-O DATA(〜2022年、I-O DATA)<ref>[https://www.iodata.jp/lib/product/d/3533.htm DiXiM Digital TV plus for I-O DATA] I-O DATA</ref>
なお仮想マシンを使って隔離しながら古いソフトウェアを動かすこともできますが、仮想マシンでも「VMエスケープ」の脆弱性を使用することでホスト環境への侵害が可能なため、仮想マシンの上で弱い環境や弱いソフトウェアを使うこともなるべく避けましょう。<!--TODO: Windows Sandbox-->
==== 古いバージョンのライブラリを避ける ====
多くのソフトウェアに使用されているライブラリとその過去の危険な脆弱性には例えば以下があります:<!--危険を認識させる。例はライブラリ内のメイン処理に存在し、任意コード実行であり、脆弱性の存在期間が長く、新しいものが好ましい。-->
* 画像ライブラリ
** libpng - [https://access.redhat.com/security/cve/cve-2010-1205 CVE-2010-1205](PNG画像で任意コード実行の可能性)
** libjpeg-turbo - [https://access.redhat.com/security/cve/cve-2012-2806 CVE-2012-2806](JPEG画像で任意コード実行の可能性)
** OpenJPEG - [https://access.redhat.com/security/cve/cve-2025-54874 CVE-2025-54874](JPEG2000画像で任意コード実行の可能性)
** libtiff - [https://access.redhat.com/security/cve/cve-2026-12912 CVE-2026-12912](PixarLog圧縮TIFF画像で任意コード実行の可能性)
** libwebp - [https://access.redhat.com/security/cve/cve-2023-4863 CVE-2023-4863](WebP画像で任意コード実行の可能性)
* 動画ライブラリ
** FFmpeg - [https://access.redhat.com/security/cve/cve-2024-22860 CVE-2024-22860](JPEG XLアニメーションで任意コード実行の可能性)
* 圧縮ライブラリ
** libarchive - [https://access.redhat.com/security/cve/cve-2026-15028 CVE-2026-15028](tarアーカイブ形式で任意コード実行の可能性)
** zlib - [https://access.redhat.com/security/cve/cve-2002-0059 CVE-2002-0059](Deflate圧縮形式で任意コード実行の可能性)
** bzip2 - [https://access.redhat.com/security/cve/cve-2010-0405 CVE-2010-0405](BZ2圧縮形式で任意コード実行の可能性)
これらのライブラリはABI(アプリケーションバイナリインターフェイス)が変更されて新しいバージョンの共有ライブラリにドロップイン置換できないものも多くなっています。
また国内で使われている古いソフトウェアでは開発中止になった以下のライブラリも問題となっています:
* UNLHA32.DLL<ref>[https://forest.watch.impress.co.jp/docs/news/372729.html 圧縮・解凍用DLL「UNLHA32.DLL」が開発中止、作者はLZHの利用中止を呼びかけ] Impress 2010年6月7日</ref>
Webフレームワークでは開発中止となった以下のフレームワークが問題となっています:
* [[:w:Model View Controller|Model View Controller]]フレームワーク(代替候補: [[:w:Apache Struts|Apache Struts]] 2、[[:w:Spring Framework#Model-View-Controller フレームワーク|Spring MVC]])
** [[:w:en:Apache Struts 1|Apache Struts 1]](〜2008年) - Java言語
* [[:w:アスペクト指向プログラミング|アスペクト指向フレームワーク]](代替候補: [[:w:Spring Framework|Spring Framework]]、[[:w:en:Micronaut (framework)|Micronaut]])
** [[:w:Seasar|Seasar]](〜2016年) - Java言語
* [[:w:シングルページアプリケーション|シングルページアプリケーション]]フレームワーク(代替候補: [[:w:Angular|Angular]]、[[:w:Vue.js|Vue.js]])
** [[:w:AngularJS|AngularJS]](〜2022年) - JavaScript
=== 古いハードウェアに対処する ===
サポート切れの OS を搭載したハードウェアはどうすれば良いでしょうか。これにはいくつかの方法があります。
==== スタンドアロン運用 ====
古いハードウェアはインターネットに繋がずに使用すること(スタンドアロン運用)も可能です。
しかしながらUSBメモリでデータをやり取りする場合はUSBメモリ経由での感染などのリスクは残ります。
==== 新しめのLinuxを導入 ====
新しめのLinuxを導入するという方法もあります。
これに適したものでは例えばWindows 11非対応のPC (Intel 第7世代以前、AMD Ryzen 1000シリーズ以前) が挙げられます。
またスマートフォンやタブレットであればカスタムROMが、ルーターであればDD-WRTやOpenWRTが存在します。
==== 手放す ====
手に負えなければデータだけバックアップして手放しましょう。情報が漏れないよう初期化も忘れずに。
== 潜在的な脆弱性を減らす ==
現代のプログラムでは以下のような保護が行われています:
* [[:w:アドレス空間配置のランダム化|アドレス空間配置のランダム化]](ASLR)
=== メモリにおける書き込みと実行の排他化 (W^X) ===
メモリでは書き込み可能領域の実行不可化 ([[:w:NXビット|NXビット]]) と実行可能領域の書き込み不可化による書き込みと実行の排他化([[:w:en:W^X|W^X]])が一般的となっています。NXビットは x86 では NXビットは AMD64 と共に搭載された古い機能であるため、今時の CPU と OS は基本的にこれに対応しています。
現在の CPU がNXビットを有効にしているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -o nx
nx
nx
[...]
</syntaxhighlight>
現在のLinuxカーネルが厳格な W^X を有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_RWX' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
</syntaxhighlight>
しかしながら書き込みと実行の排他の原則を破ってそれらを同時に行える場所というものも存在しています。読み込み・書き込み・実行が可能なことから「RWXセクション」と呼ばれています。Windows ではメモリページの PAGE_EXECUTE_READWRITE フラグがこれに相当します<ref>[https://learn.microsoft.com/ja-jp/windows/win32/memory/memory-protection-constants メモリ保護定数] メモリ保護定数 (WinNT.h) - Win32 apps | Microsoft Learn</ref>。
Windows のカーネルドライバでは NX フラグの使用が義務付けられています<ref>[https://learn.microsoft.com/en-us/windows-hardware/test/hlk/testref/driver-compatibility-with-device-guard メモリ整合性と VBS とのドライバ互換性] Microsoft</ref>が、その Windows カーネルにおいても PatchGuard の領域がコード難読化のためにこの原則を破っています。<!--TODO: ホットパッチ-->
また Linux でも実行可能領域を書き込み可能ページとして割り当てて書き込む text_poke 関数が用意されています。
=== 制御フローの操作を防ぐ (CET) ===
現代では「[[:w:Return-oriented programming|リターン指向プログラミング]]」(ROP)、「呼び出し指向プログラミング」 (COP)、「ジャンプ指向プログラミング」(JOP) 、「[[:en:Sigreturn-oriented programming|Sigreturn指向プログラミング]]」(SROP) などの制御フロー操作による攻撃が一般化していますが、これを防ぐ技術として「[[:w:en:Control-flow integrity#Intel Control-flow Enforcement Technology|制御フロー強制テクノロジー]]」(CET) の「[[:w:en:Indirect branch tracking|間接分岐追跡]]」(IBT) と「[[:w:en:Shadow stack|シャドウスタック]]」(SHSTK) が存在します。
制御フロー強制は比較的新しい技術であるため、対応する CPU は以下に限られます:
* Intel Core (Tiger Lake) 第11世代以降
* AMD Zen 3 以降(シャドウスタックのみ)
現在の CPU が間接分岐追跡 (IBT) およびシャドウスタックに対応しているかはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ grep '^flags' /proc/cpuinfo | grep -oE '(ibt|shstk)'
shstk
ibt
shstk
ibt
[...]
</syntaxhighlight>
またユーザーランドのシャドウスタックの使用にはユーザーランドだけでなくカーネルの対応も必要となります。Linux カーネル では 6.6 以降対応でこれに対応しています(sigreturnにも対応<ref>[https://github.com/torvalds/linux/commit/05e36022c0543ba55a3de55af455b00cb3eb4fcc x86/shstk: Handle signals for shadow stack · torvalds/linux@05e3602] GitHub 2023年8月3日</ref>)。 Linuxディストリビューションでは Ubuntu 24.04以降、 Red Hat Enterprise Linux 9.7 以降<ref>[https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/9.7_release_notes/new-features-kernel 4.8. カーネル - 9.7 リリースノート - Red Hat Enterprise Linux - 9 - Red Hat Documentation] Red Hat</ref>が標準でシャドウスタックを有効としています。
現在のLinuxカーネルが間接分岐追跡およびシャドウスタックを有効にしているかは以下で確認できます (出力例はUbuntu 26.04):
<syntaxhighlight lang="shell-session">
$ grep -E '_(IBT|SHADOW_STACK)' /boot/config-$(uname -r) # y=Yes, #..is not set=No
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
CONFIG_X86_USER_SHADOW_STACK=y
CONFIG_X86_DISABLED_FEATURE_IBT=y
CONFIG_ARCH_HAS_USER_SHADOW_STACK=y
</syntaxhighlight>
現在のユーザーランドプログラムの中で間接分岐追跡またはシャドウスタックが無効化されているものはLinuxでは以下で確認できます:
<syntaxhighlight lang="shell-session">
$ # License: CC0 / Public Domain
$ find / -type f -exec sh -c 'for f do readelf -h "$f" >/dev/null 2>&1 || continue; p=$(readelf -n "$f" 2>/dev/null); { printf "%s" "$p" | grep -q "x86 feature:.*IBT" && printf "%s" "$p" | grep -q "x86 feature:.*SHSTK"; } || echo "$f"; done' sh {} +
/usr/lib/lv2/carla.lv2/carla.so
/usr/lib/7zip/7z
/usr/lib/7zip/7zCon.sfx
/usr/lib/7zip/7zr
/usr/lib/7zip/7z.so
/usr/lib/7zip/7za
/usr/lib/klibc/bin/ipconfig
/usr/lib/klibc/bin/umount
/usr/lib/klibc/bin/halt
/usr/lib/klibc/bin/resume
/usr/lib/klibc/bin/dd
/usr/lib/klibc/bin/pivot_root
/usr/lib/klibc/bin/chroot
/usr/lib/klibc/bin/false
/usr/lib/klibc/bin/gzip
/usr/lib/klibc/bin/ls
/usr/lib/klibc/bin/nfsmount
/usr/lib/klibc/bin/kinit
/usr/lib/klibc/bin/sh
/usr/lib/klibc/bin/dmesg
/usr/lib/klibc/bin/uname
/usr/lib/klibc/bin/minips
/usr/lib/klibc/bin/fstype
/usr/lib/klibc/bin/mknod
/usr/lib/unrar
/usr/lib/jvm/java-25-openjdk-amd64/lib/libjsvml.so
/usr/lib/jvm/java-25-openjdk-amd64/lib/server/libjvm.so
[...]
</syntaxhighlight>
なお、制御フロー強制テクノロジーの間接分岐追跡とシャドウスタックが有効であっても異なる関数の通常呼び出しは防げません。分かりやすい例では関数の間接呼び出しにおいて関数ポインタを<code>sigaction</code>へと変更して独自のシグナルハンドラを登録し、その後クラッシュさせてそのシグナルハンドラを呼び出すという「セグメンテーション違反志向プログラミング」(SFOP) が挙げられます。また攻撃に使える関数 (dop gadgets) {{efn|dop gadgetsの検索の公式実装は「DOP-StaticAssist」[https://github.com/melynx/DOP-StaticAssist]だが長らく更新されておらず古いLLVM 3.5に依存している状態となっている。}}の通常呼び出しだけで攻撃する「Data-Oriented Programming」(DOP) <ref>Hong Hu et al. [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7546545 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks] IEEE 2016年</ref>{{efn|セキュリティ以外の文脈におけるデータ指向プログラミング、データ指向設計、データ駆動型設計とは異なる。}}という手法も存在します。
C++向けでは仮想関数テーブル (vtable) を改ざんして攻撃に使える仮想関数(仮想関数ガジェット、vfgadget)を呼び出す「偽造オブジェクト指向プログラミング」(COOP) という攻撃手法も登場しています。
=== メモリ安全性の高いソフトウェアへ ===
既存のソフトウェアの脆弱性は7割がメモリ安全性の問題に起因すると言われています<ref>[https://www.cisa.gov/sites/default/files/2023-12/CSAC_TAC_Recommendations-Memory-Safety_Final_20231205_508.pdf REPORT TO THE CISA DIRECTOR Technical Advisory Council Memory Safety] サイバーセキュリティ諮問委員会 (CSAC) 2023年12月5日</ref>。しかしながら[[C言語]]や[[C++]]はメモリ安全性が低いため、メモリ安全性の確保できる[[Rust]]などで書かれた代替プログラムが登場しています:
{| class="wikitable"
|+ コマンドのRust版
|-
! コマンドの概要 !! 従来版 !! Rust版
|-
| Unix系の基本コマンド群 || GNU Core Utilities || '''uutils coreutils'''
|-
| ファイル検索コマンド群{{efn|<code>find</code>、<code>locate</code>、<code>updatedb</code>、<code>xargs</code>の4コマンド}} || GNU Findutils || '''uutils findutils'''
|-
| ファイル差分コマンド群{{efn|<code>diff</code>、<code>cmp</code>、<code>diff3</code>、<code>sdiff</code>の4コマンド}} || GNU Diffutils || '''uutils diffutils'''
|-
| ストリームエディタ (sed) || GNU sed / FreeBSD sed || '''uutils sed'''
|-
| AWKスクリプト || GNU AWK || '''uutils AWK'''
|-
| 文字列検索 || GNU Grep || '''uutils Grep'''
|-
| tarアーカイブ || GNU Tar || '''uutils tar'''
|-
| アカウント管理コマンド群 || shadow-utils || '''uutils shadow-utils'''
|-
| アクセス制御コマンド群{{efn|<code>chacl</code>、<code>getfacl</code>、<code>setfacl</code>の3コマンド}} || acl || '''uutils acl'''
|-
| procfs{{efn|プロセスファイルシステム}}表示コマンド群 || procps / procps-ng || '''uutils procps'''
|-
| ホスト名管理コマンド群{{efn|<code>hostname</code>、<code>dnsdomainname</code>、<code>domainname</code>、<code>nisdomainname</code>、<code>ypdomainname</code>の5コマンド。}} || hostname || '''uutils hostname'''
|-
| Linuxユーティリティ || util-linux || '''uutils util-linux'''
|-
| 権限昇格 || sudo || '''sudo-rs'''
|-
| 時刻同期 || ntpd || '''ntpd-rs'''
|-
| セキュアシェル (SSH) || OpenSSH || '''russh'''
|}
これらのRustで書かれたコマンドのうちuutils coreutilsとsudo-rsはUbuntuに採用されています。
またライブラリでもRustだけ (Pure Rust) で実装されたものが登場しています:
* 画像ライブラリ - これらは例えばGNOMEデスクトップ環境の画像ローダーGlycinから使われています<ref>[https://gitlab.gnome.org/GNOME/glycin GNOME / glycin · GitLab] GNOME Project</ref>。
** libpng → pngクレート - PNG画像向け。
** libgif → gifクレート - GIF画像向け。
** libjpeg / libjpeg-turbo → zune-jpeg / libjpeg-turbo-rs - JPEG画像向け。
** OpenJPEG → hayro-jpeg2000 - JPEG 2000画像向け。
** libtiff → tiffクレート - Tiff画像向け
** libwebp → image-webpクレート - WebP画像向け。
** libraw → libopenraw - RAW画像向け。
** librsvg - SVG画像向け。C言語からRustに書き直しされました。
* 圧縮ライブラリ
** zlib / zlib-ng → zlib-rs - Deflate圧縮向け
** libbzip2 → bzip2-rs - BZ2圧縮向け
* 暗号化ライブラリ
** OpenSSL / GnuTLS → [[:w:en:Rustls|Rustls]]
* Unicode処理ライブラリ
** ICU4C → ICU4X
* テキスト整形ライブラリ
** HarfBuzz → HarfRust
* ブラウザエンジン
** Blink/Gecko → Servo
<!--
=== 整合性チェック ===
PatchGuard / HyperGuard
-->
== 不審な改変が行われていないかを調べる ==
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| Windows || %APPDATA%\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>* || C:\<wbr>ProgramData\<wbr>Microsoft\<wbr>Windows\<wbr>Start Menu\<wbr>Programs\<wbr>Startup\<wbr>*
|-
| [[:w:PowerShell|PowerShell]] プロファイル<ref>[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.6 about_Profiles - PowerShell - Microsoft Learn] Microsoft</ref> || %USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Profile.ps1<br>%USERPROFILE%\<wbr>Documents\<wbr>PowerShell\<wbr>Microsoft.PowerShell_profile.ps1 || C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Profile.ps1<br>C:\<wbr>Windows\<wbr>System32\<wbr>WindowsPowerShell\<wbr>*\<wbr>Microsoft.PowerShell_profile.ps1
|}
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能な設定ファイル
|-
! 規格/アプリケーション !! ユーザー !! システム
|-
| POSIX標準 || ~/.profile || /etc/profile
|-
| XDG Base Directory<wbr>標準 || ~/.local/bin/* ||
|-
| FHS{{efn|Filesystem Hierarchy Standard}}<wbr>標準[https://refspecs.linuxfoundation.org/fhs.shtml] || || /bin/* /sbin/* /usr/bin/* /usr/local/bin/* /etc/inittab
|-
| LSB{{efn|Linux Standard Base}}<wbr>標準[https://refspecs.linuxfoundation.org/lsb.shtml] || || /etc/profile.d/* /etc/init.d/* /etc/cron.d/*
|-
| Desktop Application Autostart Specification<wbr>標準[https://specifications.freedesktop.org/autostart/latest/] || ~/.config/autostart/* /media/*/*/.autorun /media/*/*/autorun /media/*/*/autorun.sh /run/media/*/*/.autorun /run/media/*/*/autorun /run/media/*/*/autorun.sh || /etc/xdg/autostart/*
|-
| Bash || ~/.bash_profile ~/.bashrc || /etc/bash_profile /etc/bash.bashrc /etc/bash.bash_logout
|-
| Z shell (Zsh) || ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout || /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout<br/>(または /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout)
|-
| Systemd || ~/.config/systemd/user/* || /etc/systemd/system/* /etc/systemd/user/*
|-
| Xorg || ~/.xinitrc ~/.xserverrc ~/.xsession || /etc/X11/xinit/xinitrc /etc/X11/xinit/xserverrc /etc/X11/Xsession /usr/share/xsessions/*
|-
| Wayland || || /usr/share/wayland-sessions/*
|-
| Python || ~/.local/lib/python*/site-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getusersitepackages())'</code>で確認可能。}} || /usr/lib/python*/dist-packages/*/** /usr/local/lib/python*/dist-packages/*/**{{efn|絶対パスは<code>python3 -c 'import site; print(site.getsitepackages())'</code>で確認可能。}}
|-
| Perl{{efn|Debian/UbuntuではDebianパッケージ設定システム (debconf) のためにPerlを使用している。}} || || /usr/share/perl*/** /usr/local/share/perl*/** /usr/lib/*/perl*/** /usr/local/lib/*/perl*/**{{efn|絶対パスは<code>perl -V:installsitearch -V:installsitelib -V:installvendorarch -V:installvendorlib -V:archlib -V:privlib -V:installarchlib -V:installprivlib</code>で確認可能。}}
|}
=== パッケージ管理ファイルを検証する ===
パッケージ管理システムが管理しているファイルではファイルハッシュが保存されているため簡単にその検証を行うことが可能です:
* Windows: <code>sfc /scannow</code>
* Debian/Ububntu(Debパッケージ): <code>debsums -s</code>
* RedHat/Fedora(RPMパッケージ): <code>rpm -Va</code>
ただしローカルハッシュが改ざんされている可能性もあるため過信はできません。<!--TODO: ローカルハッシュの検証法-->
自動的にシステムの検証を行うシステムも存在します:
* Android - ブロックデバイスレベルでのハッシュ検証 (dm-verityベース)<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref>
<!--
またUbuntuのSnapパッケージでもdm-verityの導入が進められています。
また特定言語のパッケージの検証は以下で可能です:
* PIP (Python): なし
-->
=== システム領域に不審なファイルが追加されていないかを調べる ===
システムの追加ファイルの検知にはパッケージシステムで管理されていないファイルの一覧を返す以下のようなツールが存在します:
* Debian / Ubuntu(Debパッケージ)向け: cruft-ngパッケージ(<code>cruft</code>コマンド)
上記の<code>cruft</code>コマンドでは設定ファイルだけ残っているパッケージのファイルも出てきてしまいます。そのため、これが邪魔な時は設定ファイルだけ残っているパッケージを<code>sudo apt purge '~c'</code>で削除しましょう。
=== ユーザー領域に不審なファイルが追加されていないかを調べる ===
ユーザースクリプトの書き換えや追加は検知が難しいです。<!--TODO: 良い方法を書く-->
共有ライブラリやスクリプトによるプラグイン追加も可能となっているため、こちらにも気をつけなければいけません。これには例えば以下があります:
{| class="wikitable"
|+ 代表的なユーザースクリプトや拡張機能のディレクトリパス
|-
! 種類 !! Windowsのパス !! macOSのパス !! Linuxのパス
|-
| Google Chrome 拡張機能 || %LOCALAPPDATA%\Google\Chrome\User Data\*\Extensions\ || ~/Library/Application Support/Google/Chrome/*/Extensions/ || ~/.config/google-chrome/*/Extensions/
|-
| GIMPプラグイン<ref>[https://gimp.cc/faq/add-gimp-plugins.html How to Install GIMP Plugins - Detailed Guide with Troubleshooting] GIMP.cc</ref> || %APPDATA%\GIMP\*\plug-ins\ || ~/Library/Application Support/GIMP/*/plug-ins/ || ~/.config/GIMP/*/plug-ins/
|-
| Blenderスクリプト{{efn|起動スクリプト、アドオンを含む。}}<ref>[https://docs.blender.org/manual/ja/dev/advanced/blender_directory_layout.html Blender's Directory Layout] Blender Foundation</ref> || %APPDATA%\Blender Foundation\Blender\*\scripts\ || ~/Library/Application Support/Blender/*/scripts/ || ~/.config/blender/*/scripts/
|-
| Ardourスクリプト<ref>[https://manual.ardour.org/lua-scripting/ The Ardour Manual - Lua Scripting] Ardour</ref> || %LOCALAPPDATA%\ardour*\scripts\ || ~/Library/Preferences/Ardour*/scripts/ || ~/.config/ardour*/scripts/
|-
| LibreOfficeスクリプト || %APPDATA%\LibreOffice\*\user\Scripts\ || ~/Library/Application Support/LibreOffice/*/user/Scripts/ || ~/.config/libreoffice/*/user/Scripts/
|-
| Visual Studio Code 拡張機能<ref>[https://code.visualstudio.com/docs/configure/extensions/extension-marketplace Extension Marketplace] Microsoft</ref> || %USERPROFILE%\.vscode\extensions\ || ~/.vscode/extensions/ || ~/.vscode/extensions/
|}
=== 改変・追加されたファイルが危険かを調べる ===
実行ファイルやスクリプトはLinuxでは以下で検出できます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs file | grep -i -E ':.*(executable|shared object|relocatable|script)'
/etc/init.d/binfmt-support.dpkg-new: POSIX shell script, ASCII text executable
/etc/update-motd.d/99-livepatch-kernel-upgrade-required: POSIX shell script, ASCII text executable
/usr/lib/chromium-browser/plugins/libpepflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5c421e89a5c062a2106a5a4381dc38e779a22795, stripped
</syntaxhighlight>
またClamAVを導入していれば以下でマルウェアデータベースとの照合を行うことができます:
<syntaxhighlight lang="shell-session">
# cat filelist.txt | xargs clamscan
Loading: 3s, ETA: 0s [========================>] 3.63M/3.63M sigs
Compiling: 1s, ETA: 0s [========================>] 41/41 tasks
/etc/apt/apt.conf.d/00trustcdrom: OK
/etc/apt/auth.conf.d/90ubuntu-advantage: OK
/etc/apt/keyrings/google.asc: OK
[...]
----------- SCAN SUMMARY -----------
Known viruses: 3628164
Engine version: 1.5.4
Scanned directories: 125
Scanned files: 1919
Infected files: 0
Total errors: 10
Data scanned: 247.72 MiB
Data read: 281.17 MiB (ratio 0.88:1)
Time: 17.939 sec (0 m 17 s)
Start Date: 2026:10:11 05:41:30
End Date: 2026:10:11 05:41:48
</syntaxhighlight>
=== 設定データベースを検証する ===
設定データベースは Windows ではレジストリ、Linuxでは GNOME / MATEの 使う [[:en:dconf|dconf]] が存在します。
Windows の設定データベースはレジストリと呼び「レジストリエディタ」 (<code>regedit</code>) で表示できます。
{| class="wikitable"
|+ Windows における代表的なユーザースクリプト又はコマンド起動が可能なレジストリ
|-
! 規格/アプリケーション !! 各ユーザー !! 全ユーザー
|-
| Windows || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"|RunOnceは一度のみ実行だが再登録することで何回でも実行可能。}} || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>Run\<wbr>*<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows\<wbr>CurrentVersion\<wbr>RunOnce\<wbr>*{{efn|name="runonce"}}
|-
| [[:w:en:Active Setup|Active Setup]]<ref>[https://www.advancedinstaller.com/application-packaging-training/msi/ebook/active-setup.html Active-Setup Mechanism] Advanced Installer</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Active Setup\<wbr>Installed Components\<wbr>*\<wbr>StubPath
|-
| [[:w:Windowsサービス|Windowsサービス]]<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree HKLM\SYSTEM\CurrentControlSet\Services レジストリ ツリー - Windows drivers - Microsoft Learn] Microsoft</ref> || || HKEY_LOCAL_MACHINE\<wbr>SYSTEM\<wbr>CurrentControlSet\<wbr>services\<wbr>*
|-
| [[:w:Winlogon|Winlogon]].exe || || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Shell<br>HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Windows NT\<wbr>CurrentVersion\<wbr>Winlogon\<wbr>Userinit
|-
| [[:w:cmd.exe|cmd.exe]]<ref>[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd cmd - Microsoft Learn] Microsoft</ref> || HKEY_USERS\<wbr>*\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\REG_EXPAND_SZ || HKEY_LOCAL_MACHINE\<wbr>Software\<wbr>Microsoft\<wbr>Command Processor\<wbr>AutoRun\<wbr>REG_SZ
|-
| [[Microsoft Edge]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Microsoft\<wbr>Edge\<wbr>ExtensionInstallForcelist<ref>[https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies/extensioninstallforcelist Microsoft Edge ブラウザー ポリシードキュメント ExtensionInstallForcelist - Microsoft Learn] Microsoft</ref>{{efn|name="silent-install"|自動的にサイレントインストールする}}
|-
| [[Google Chrome]] || || HKEY_LOCAL_MACHINE\<wbr>SOFTWARE\<wbr>Policies\<wbr>Google\<wbr>Chrome\<wbr>ExtensionInstallForcelist<ref>[https://chromeenterprise.google/intl/ja_jp/policies/extension-install-forcelist/ ExtensionInstallForcelist: 自動インストールするアプリと拡張機能のリストの設定 - Chrome Enterprise] Google</ref>{{efn|name="silent-install"}}
|}
Linux の GNOME / MATE 環境には「[[:w:en:Dconf#dconf database|dconf データベース]]」が存在し、それは<code>dconf dump</code>('/'区切り)で表示できます。また dconf データベースにスキーマ(規定値と解説)を被せた gsettings も存在し、こちらは<code>gsettings list-recursively</code>(dconfと異なり'.'区切り)で表示できます。
{| class="wikitable"
|+ Linux における代表的なユーザースクリプト又はコマンド起動が可能なdconf設定
|-
! 規格/アプリケーション !! ユーザー
|-
| GNOME Settings Daemon || /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom*/command
|-
| Marco ([[w:MATE (デスクトップ環境)|MATE]]) || /org/mate/Marco/keybinding-commands/command-*{{efn|変更した設定は<code>dconf dump /org/mate/Marco/keybinding-commands/</code>で、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.Marco.keybinding-commands</code>で表示可能。}}
|-
| MATE Screensaver || /org/mate/screensaver/embedded-keyboard-command<br>/org/mate/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/mate/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.mate.screensaver</code> で表示可能}}
|-
| mate-applets || /org/mate/panel/objects/object-*/prefs/command
|-
| mate-sensors-applet || /org/mate/panel/objects/object-*/prefs/*/high-alarm-command<br>/org/mate/panel/objects/object-*/prefs/*/low-alarm-command
|}
なお MATE Screensaver と同源の GNOME Screensaver にも /org/gnome/desktop/screensaver/embedded-keyboard-command と /org/gnome/desktop/screensaver/logout-command{{efn|変更した設定は<code>dconf dump /org/gnome/desktop/screensaver/</code>、デフォルトも含めた設定は<code>gsettings list-recursively org.gnome.desktop.screensaver</code> で表示可能。}} が存在しますが、こちらは既に廃止されており指定しても無視されます<ref>[https://github.com/GNOME/gsettings-desktop-schemas/blob/main/schemas/org.gnome.desktop.screensaver.gschema.xml.in gsettings-desktop-schemas/schemas/org.gnome.desktop.screensaver.gschema.xml.in at main · GNOME/gsettings-desktop-schemas] GNOME Project</ref>。
== 改変を防ぐ ==
改変を探すのは大変です。なので最初から改変をできないようにすれば管理はとても楽になります。
改ざんを防ぐには「[[:w:en:Chain of trust|信頼の連鎖]]」 (chain of trust) が重要となります。例えばカーネルだけで改ざんを防いでも、ハードウェアのファームウェアが不正であれば不正なカーネルを起動できてしまいます。
=== ファームウェア改ざんを防ぐ ===
ファームウェア改ざんによる「ファームウェアルートキット」を防ぐにはIntel Management Engine (Intel ME)で実装されているIntel BIOS Guardを使う必要があります。<!--TODO: マザーボードによってはBIOSで有効にする必要があります。→最近のマザーボード事情-->
なお2017年の第8世代Intel Coreプロセッサ (Coffee Lake) 以前はme_cleanerによってIntel Management Engineの無効化が可能<ref>[https://github.com/corna/me_cleaner/wiki/me_cleaner-status me_cleaner status] Nicola Corna 2018年</ref>なため非推奨です。
また2023年のIntel ME 16.1.30.2307未満では悪意あるロゴ画像を設定することによってroot権限からUEFI設定の変更が可能です([[:w:en:LogoFAIL|LogoFAIL]]の脆弱性)。そのため、古いIntel Management Engineが動作している場合はそのファームウェアをアップデートしましょう。Windowsでは MEUpdateTool.exe / FWUpdLcl.exe を使うことでこのアップデートが可能となっています。一方、Linuxでは一部機種が fwupdmgr 経由での Intel ME ファームウェアアップデートに対応しています。
Intel MEのバージョンはLinuxでは以下のような感じに調べることができます:
<syntaxhighlight lang="shell-session">
$ cat /sys/class/mei/mei0/fw_ver
0:16.1.32.2473
0:16.1.32.2473
0:16.1.27.2181
</syntaxhighlight>
=== ブートローダー改ざんを防ぐ ===
ブートローダーは起動に使われるファームウェア (BIOS) から呼ばれ、カーネルを読み込んで起動するために使われるプログラムです。古い BIOS (レガシーBIOS) には起動するブートローダーを検証する仕組みが存在しませんでしたが、新しい UEFI (統一拡張ファームウェアインターフェース) には署名されたブートローダーのみを起動する UEFI Secure Boot が追加され、安全なブートローダーの起動を許可するための「承認済み署名データベース」 (Authorized Signature Database、UEFI db) と、脆弱なブートローダーの起動を防ぐための「禁止署名データベース」 (Forbidden Signature Database、UEFI dbx) が用意されています。
UEFI Secure Boot が有効かどうかは以下で確認できます:
* Windows PowerShell: <code>Confirm-SecureBootUEFI</code>
* Linux: <code>mokutil --sb-state</code>
UEFI db と UEFI dbx の内容は以下で確認できます:
* Windows PowerShell: <code>Get-SecureBootUEFI -Name db -Decoded</code> / <code>Get-SecureBootUEFI -Name dbx -Decoded</code>
* Linux:
** mokutil{{efn|Ubuntu Desktop に標準で含まれている。}}: <code>mokutil --db</code> / <code>mokutil --dbx</code>
** efitools: <code>efi-readvar -v db</code> / <code>efi-readvar -v dbx</code>
ブートローダーの署名情報は以下で確認できます:
* Windows PowerShell: <code>Get-PfxCertificate</code>{{efn|<code>Get-AuthenticodeSignature</code>はカタログ署名が使われる場合があるため非推奨: https://github.com/PowerShell/PowerShell/issues/23820 。}}
* Linux: <code>sbverify --list</code>
例えば Windows PowerShell では以下のような感じです:
<syntaxhighlight lang="powershell">
PS C:\WINDOWS\system32> mountvol S: /S; if ($?) { Get-PfxCertificate 'S:\EFI\Microsoft\Boot\bootmgfw.efi'; mountvol S: /D }
Thumbprint Subject
---------- -------
FACDE3D80E99AFCC15E08AC5A69BD22785287F79 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
</syntaxhighlight>
また Ubuntu や Debian では署名されたブートローダー (grub-efi-*-signedパッケージ) と非署名のブートローダー (grub-efi-*-unsignedパッケージ) の両方が用意されており、ブートローダーの正体がどれか、また署名されたブートローダーの署名内容を確認するのは以下のような感じとなります:
<syntaxhighlight lang="shell-session">
$ dpkg -L grub-efi-amd64-signed | grep -i '\.efi' | xargs md5sum # インストールされている署名されたブートローダーのハッシュを表示(grub*は通常版、gcd*は光学ブートメディア向け、grubnet*はネットブート向け)
2bd267fb12bd3b0fe26a9dfb4290868d /usr/lib/grub/x86_64-efi-signed/gcdx64.efi.signed
f689e93336a015fa6eb93e1913b13482 /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed
b63c7618fb96d52520b42b8cc7b124f0 /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
$ sudo sh -c "md5sum /boot/efi/EFI/BOOT/*" # 現在のbootloaderがどれを使っているかを確認(署名されたgrubを使用)
b63c7618fb96d52520b42b8cc7b124f0 /boot/efi/EFI/BOOT/BOOTX64.EFI
$ sudo sbverify --list /boot/efi/EFI/BOOT/BOOTX64.EFI
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/efi/EFI/BOOT/BOOTX64.EFI
Signature verification OK
</syntaxhighlight>
なお Linux では grub の代わりに使えるブートローダーとして systemd-boot もあります。systemd-boot の署名版は Debian が systemd-boot-efi-*-signed パッケージとして用意しているようです(Ubuntu未搭載)。
<!--TODO:
TPM (Trusted Platform Module) チップ
-->
=== カーネル本体の改ざんを防ぐ ===
カーネルはオペレーティングシステム (OS) の下層で動き続けるプログラムです。カーネル本体の実行ファイルもブートローダーと同様に署名が行われており、UEFI Secure Boot が有効であればその検証をブートローダーが行います。Linux では GRUB の UEFI Secure Boot と shim_lock の連携がそれに相当します<ref>[https://www.gnu.org/software/grub/manual/grub/grub.html#UEFI-secure-boot-and-shim GNU GRUB Manual 2.14 - 19.4 UEFI secure boot and shim support] フリーソフトウェア財団</ref>。
なお Ubuntu には署名されたカーネル (linux-image-*パッケージ) と非署名のカーネル (linux-image-unsigned-*パッケージ) の両方が用意されており、署名されているカーネルは以下のような感じでその署名が確認できます:
<syntaxhighlight lang="shell-session">
$ sudo sbverify --list /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を確認する
signature 1
image signature issuers:
- /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
image signature certificates:
- subject: /C=GB/ST=Isle of Man/O=Canonical Ltd./OU=Secure Boot/CN=Canonical Ltd. Secure Boot Signing (2022 v1)
issuer: /C=GB/ST=Isle of Man/L=Douglas/O=Canonical Ltd./CN=Canonical Ltd. Master Certificate Authority
$ sudo sbverify --cert /usr/share/grub/canonical-uefi-ca.crt /boot/vmlinuz-$(uname -r) # Linuxカーネル本体の署名を検証する
Signature verification OK
</syntaxhighlight>
=== カーネルモジュールの改ざんを防ぐ ===
カーネルモジュールも署名されており、その検証をカーネルが行っています。Windowsカーネルでは ci.dll (Code Integrityモジュール)が、Linuxカーネルでは CONFIG_MODULE_SIG コンパイルオプションがその検証を行っています。
カーネルによるカーネルモジュールの検証が有効かどうかは以下で確認することができます:
* Linux: <code>cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG=</code>
カーネルによるカーネルモジュールの検証で読み込みを弾くかどうかは以下で確認することができます:
* Windows: 強制モードか評価モード (監査モード) かを確認する PowerShell スクリプトが Microsoft のサイトに存在します: https://support.microsoft.com/en-us/windows/hardware/drivers/the-windows-driver-policy#is-my-device-in-evaluation-mode-or-enforcement-mode
* Linux: <code>cat /sys/module/module/parameters/sig_enforce</code>
また Linux では検証で読み込みを弾かない場合でも検証外カーネルモジュールを読み込んだ場合はdmesgに警告が出て '''Tainted kernel''' 扱いとなります<ref>[https://docs.kernel.org/admin-guide/tainted-kernels.html Tainted kernels] Linux Foundation</ref>。以下はその例です:
<syntaxhighlight lang="shell-session">
$ cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG= # y=Yes, n=No
CONFIG_MODULE_SIG=y
$ cat /sys/module/module/parameters/sig_enforce # Y=Yes, N=No
N
$ sudo dmesg | grep 'module verification'
[ 8.928361] nvidia: module verification failed: signature and/or required key missing - tainting kernel
$ wget http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint
[...]
$ sudo sh ./kernel-chktaint
Kernel is "tainted" for the following reasons:
* externally-built ('out-of-tree') module was loaded (#12)
* unsigned module was loaded (#13)
Raw taint value as int/string: 12288/'G OE '
Tainted modules:
* nvidia (OE)
* nvidia_drm (OE)
* nvidia_modeset (OE)
* nvidia_uvm (OE)
For a more detailed explanation of the various taint flags see
Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources
or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
</syntaxhighlight>
また Linux では以下のような感じで個々のモジュールの署名が確認できます:
<syntaxhighlight lang="shell-session">
$ modinfo /lib/modules/$(uname -r)/kernel/arch/x86/kernel/msr.ko.zst
filename: /lib/modules/7.0.0-38-generic/kernel/arch/x86/kernel/msr.ko.zst
license: GPL
description: x86 generic MSR driver
author: H. Peter Anvin <hpa@zytor.com>
srcversion: 639B995855A3528050FD532
depends:
intree: Y
name: msr
retpoline: Y
vermagic: 7.0.0-38-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 3B:E7:D3:BF:D3:2E:D9:CA:9C:17:D2:E9:5F:1A:1C:AE:67:D5:82:2F
sig_hashalgo: sha512
signature: 96:BC:2A:18:6E:4D:D8:E5:28:69:9D:E6:65:89:95:D4:BE:4C:5B:7C:
4A:23:11:75:F6:FE:63:79:FC:29:9B:F7:EA:24:B6:F1:EF:F3:80:17:
0B:C0:1E:46:61:29:BB:F9:E0:AC:81:69:85:73:7D:D4:77:82:A8:DB:
[...]
</syntaxhighlight>
=== システムファイル改ざんを防ぐ ===
システムファイル改ざんを防ぐ良い方法はシステム領域を読み取り専用にすることですが、仮にファイルシステムを読み取り専用のファイルシステム(SquashFSやEROFS)にしたとしても記録する場所がSSDであればブロック単位での上書きが可能となります。
1回だけ書き込めて上書きが不可能な媒体としてはCD-R、DVD-R、DVD+R、BD-Rなどの一部の光学メディアが存在しますが、これらをブートメディアとして使用するのは頻繁なアップデートが難しくなります。
そのほかの手法としては別のコンピュータからシステムファイルを取得する「ネットワークブート」を行うという手法もありますが、これはネットワーク経由でシステムファイルが盗まれる可能性と隣り合わせです。しかしながらプロトコルにUEFI HTTPSを、認証に相互認証のmTLSを用いて、その秘密鍵をTPMで管理してOSから読めなくすることでネットワークブートの安全性は何とか確保できるかもしれません(対応マザーボードは不明)。
一方、Android や ChromeOS ではブロックデバイス単位での改ざん検知 (dm-verify) によってシステムイメージの改ざんを防止しています<ref>[https://source.android.com/docs/security/features/verifiedboot/dm-verity?hl=ja dm-verity の実装] Google</ref><ref>[https://research.google/pubs/verified-boot-on-chrome-os-and-how-to-do-it-yourself/ Verified Boot on Chrome OS and How to do it yourself] Google</ref>。
=== カーネルメモリ改ざんを防ぐ ===
カーネルメモリのコード部分は MMU の書き込み禁止によって保護されています。iOS / macOS では Kernel Integrity Protection が<ref>[https://support.apple.com/ja-jp/guide/security/sec8b776536b/web オペレーティングシステムの整合性] Apple</ref> 、Linux では Kernel Strict RWX がこれに相当します<ref>[https://docs.kernel.org/security/self-protection.html Kernel Self-Protection] Linux Foundation</ref>。Windows でもカーネルモードに読み込み専用メモリセグメントが存在し、これに書き込もうとするとブルースクリーンで ATTEMPTED_WRITE_TO_READONLY_MEMORY (0xBE) が発行されます<ref>[https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory バグ チェック 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY] Microsoft</ref>。しかしながら Linux Kernel では kprobes、Static Keys、Static calls などで自己書き換えが多用されているため、一時的にコード部分を書き込み可能なページに割り当てて書き換える text_poke(...) という抜け道が存在します。
また定期的に改ざんが行われていないかをチェックする仕組みも存在します。Windows では[[:w:Kernel Patch Protection|Kernel Patch Protection]] (PatchGuard) / HyperGuard が、Linux では Linux Kernel Runtime Guard(外部パッチ)がこれに該当します。Windows の PatchGuard では改ざんが検出されたらブルースクリーンで CRITICAL_STRUCTURE_CORRUPTION が発行されます。
<!--TODO: Windows の HVCI、macOS の Secure Page Table Monitor / Trusted Execution Monitor-->
<!--
=== アプリケーション改ざんを防ぐ ===
SELinux / AppArmor
-->
== 攻撃用AIを対策する ==
攻撃用AIでは基本的に賢いかつ制限の緩い大規模言語モデル (LLM) が使われています。この代表的な例として GLM 5.3 や Qwen3.8-27B-ABLITERATED が存在します。
=== コンテキスト爆弾を設置する ===
攻撃用AIの対策では相手のLLMを止めることが重要となります。そこで使えるのが'''コンテキスト爆弾''' (context bombs) という手法です<ref>[https://arstechnica.com/security/2026/07/now-defenders-are-embracing-the-prompt-injection-too/ Now, defenders are embracing the prompt injection, too] Ars Technica 2026年7月14日</ref>。
このコンテキスト爆弾は「相手のLLMに対し応答やツール呼び出しで禁止されていることを行わせようとする」というプロンプトインジェクションの一種であり、それによって相手のガードレールがLLMを止めることで相手からの攻撃を防ぎます。この手法は相手の読みそうなテキストにただプロンプトを書いておけば良いだけなので、お手軽に使えます。
コンテキスト爆弾のテキスト例は以下のリポジトリに存在します:
* https://github.com/tracebit-com/context-bombs
=== ハニーポット ===
ハニーポットは攻撃者を引きつける役目を担います。ハニーポットの評価フレームワークには「UHBS」(Universal Honeypot Benchmarking Standard) が、その品質基準には「UHQS」(Universal Honeypot Quality Score) が存在しますが、2026年現在多くのハニーポットがFランク〜Dランクと残念な状況になっています<ref>[https://uhbs.github.io/uhbs-standard/mkdocs/conformance/ Overview - UHBS — Honeypot Evaluation Framework]</ref>。
<!--
== 自作コードの脆弱性を塞ぐ ==
書きかけ
-->
== 脚注 ==
<references group="注釈"/>
== 参考文献 ==
<references/>
{{DEFAULTSORT:こんひゆうたせきゆりてい}}
[[Category:計算機科学]]
[[Category:情報技術]]
1aivgrd1qyq5pxfqhvs04fo648relr5
高等学校日本史探究/律令体制再編期の政治と社会Ⅱ
0
48956
304719
304702
2026-10-14T22:50:53Z
Kwawe
68789
/* 律令政治の再編成 */ 嵯峨天皇の子供は約50人もいた。
304719
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。
藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ検非違使を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[令外官]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
== 法・儀式の整備と教育 ==
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
dr7ge7eux2ww4swjhig1jiwoa529uaz
304720
304719
2026-10-14T22:52:11Z
Kwawe
68789
/* 律令政治の再編成 */ 東寺の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれない。
304720
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。
藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ検非違使を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[令外官]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
なお、平安京南端の羅城門は敵の侵入を防ぐために毘沙門天像を置いたかもしれません。現在、東寺の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれません。羅城門の伝兜跋毘沙門天立像が東寺へ引っ越しして羅城門の旧像を置いたのかもしれません。
== 法・儀式の整備と教育 ==
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
88b6ri7dbk7d0s9b0us4ne413rid3lg
304721
304720
2026-10-14T22:56:33Z
Kwawe
68789
/* 律令政治の再編成 */ 伝兜跋毘沙門天立像写真を追加。
304721
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。
藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ検非違使を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
[[ファイル:Kyowogokokuji Monastery Tobatsu Bishamonten (280).jpg|サムネイル|241x241ピクセル|兜跋毘沙門天(教王護国寺)]]
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[令外官]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
なお、平安京南端の羅城門は敵の侵入を防ぐために毘沙門天像を置いたかもしれません。現在、教王護国寺(東寺)の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれません。羅城門の伝兜跋毘沙門天立像が教王護国寺(東寺)へ引っ越しして羅城門の旧像を置いたのかもしれません。
== 法・儀式の整備と教育 ==
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
2e59g5a1ir90foby757gi2obbgsgbeh
304723
304721
2026-10-14T23:03:09Z
Kwawe
68789
/* 律令政治の再編成 */ 嵯峨天皇の写真を追加。
304723
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。<gallery mode="nolines" widths="250" heights="250">
ファイル:Emperor Saga large.jpg|嵯峨天皇
</gallery>藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ検非違使を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
[[ファイル:Kyowogokokuji Monastery Tobatsu Bishamonten (280).jpg|サムネイル|241x241ピクセル|兜跋毘沙門天(教王護国寺)]]
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[令外官]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
なお、平安京南端の羅城門は敵の侵入を防ぐために毘沙門天像を置いたかもしれません。現在、教王護国寺(東寺)の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれません。羅城門の伝兜跋毘沙門天立像が教王護国寺(東寺)へ引っ越しして羅城門の旧像を置いたのかもしれません。
== 法・儀式の整備と教育 ==
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
jbmrx5cqjzukrv7ncsij27rizykm402
304724
304723
2026-10-14T23:34:54Z
Kwawe
68789
/* 律令政治の再編成 */ 平城天皇・高丘親王の写真を追加。
304724
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。<gallery mode="nolines" widths="250" heights="250">
ファイル:Emperor Saga large.jpg|嵯峨天皇
ファイル:Emperor Heizei-colord.jpg|平城天皇
ファイル:The prince Takaoka.jpg|高岳親王
</gallery>藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ検非違使を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
[[ファイル:Kyowogokokuji Monastery Tobatsu Bishamonten (280).jpg|サムネイル|241x241ピクセル|兜跋毘沙門天(教王護国寺)]]
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[令外官]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
なお、平安京南端の羅城門は敵の侵入を防ぐために毘沙門天像を置いたかもしれません。現在、教王護国寺(東寺)の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれません。羅城門の伝兜跋毘沙門天立像が教王護国寺(東寺)へ引っ越しして羅城門の旧像を置いたのかもしれません。
== 法・儀式の整備と教育 ==
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
tsdqai4p80pa6ekxr94imgikuq5nu8b
304728
304724
2026-10-15T10:14:45Z
Kwawe
68789
/* 法・儀式の整備と教育 */ 朝廷は昔ながらの大宝律令・養老律令を守りながら、古い条文を新しい条文に直した。この時、新しい条文として格と式が使われた。
304728
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。<gallery mode="nolines" widths="250" heights="250">
ファイル:Emperor Saga large.jpg|嵯峨天皇
ファイル:Emperor Heizei-colord.jpg|平城天皇
ファイル:The prince Takaoka.jpg|高岳親王
</gallery>藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ検非違使を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
[[ファイル:Kyowogokokuji Monastery Tobatsu Bishamonten (280).jpg|サムネイル|241x241ピクセル|兜跋毘沙門天(教王護国寺)]]
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[令外官]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
なお、平安京南端の羅城門は敵の侵入を防ぐために毘沙門天像を置いたかもしれません。現在、教王護国寺(東寺)の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれません。羅城門の伝兜跋毘沙門天立像が教王護国寺(東寺)へ引っ越しして羅城門の旧像を置いたのかもしれません。
== 法・儀式の整備と教育 ==
朝廷は昔ながらの大宝律令・養老律令を守りながら、古い条文を新しい条文に直しました。この時、新しい条文として格と式が使われました。格は現代法律の第α項に当たり、詔勅・太政官官符なども格に入りました。式は現代法律の第α号に当たり、条件・対象を細かく分けました。しかし、格と式は何度も出され、大宝律令・養老律令も読みにくくなりました。平安時代初期の朝廷は大量の格と式を整理して、法令集にまとめるようになりました。
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
7bq095saroqidvv7sreakk8xnj2aabk
304729
304728
2026-10-15T10:19:22Z
Kwawe
68789
/* 律令政治の再編成 */ 重要用語を色太字化。
304729
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。<gallery mode="nolines" widths="250" heights="250">
ファイル:Emperor Saga large.jpg|嵯峨天皇
ファイル:Emperor Heizei-colord.jpg|平城天皇
ファイル:The prince Takaoka.jpg|高岳親王
</gallery>藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ<span style="color:#f29100">'''検非違使'''</span>を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
[[ファイル:Kyowogokokuji Monastery Tobatsu Bishamonten (280).jpg|サムネイル|241x241ピクセル|兜跋毘沙門天(教王護国寺)]]
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[<span style="color:#f29100">'''令外官'''</span>]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
なお、平安京南端の羅城門は敵の侵入を防ぐために毘沙門天像を置いたかもしれません。現在、教王護国寺(東寺)の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれません。羅城門の伝兜跋毘沙門天立像が教王護国寺(東寺)へ引っ越しして羅城門の旧像を置いたのかもしれません。
== 法・儀式の整備と教育 ==
朝廷は昔ながらの大宝律令・養老律令を守りながら、古い条文を新しい条文に直しました。この時、新しい条文として格と式が使われました。格は現代法律の第α項に当たり、詔勅・太政官官符なども格に入りました。式は現代法律の第α号に当たり、条件・対象を細かく分けました。しかし、格と式は何度も出され、大宝律令・養老律令も読みにくくなりました。平安時代初期の朝廷は大量の格と式を整理して、法令集にまとめるようになりました。
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
blpdsf382chg4uic98jqf9lsy6odkmu
304730
304729
2026-10-15T10:20:41Z
Kwawe
68789
/* 法・儀式の整備と教育 */ 重要用語を色太字化。
304730
wikitext
text/x-wiki
[[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>律令体制再編期の政治と社会Ⅱ
== 律令政治の再編成 ==
桓武天皇の政治改革は次期天皇の<span style="color:#f29100">'''平城天皇'''</span>と<span style="color:#f29100">'''嵯峨天皇'''</span>も引き継ぎました。806年、平城天皇は官司再編を行いました。2000年の中央省庁再編<ref>中央省庁再編の詳細は[[高等学校日本史探究/新たな世紀の日本へⅡ|新たな世紀の日本へⅡ]]の「行政改革と日米安保の変化」を参照してください。</ref>と同じように役所数と職員数を減らして、役所をまとめて官司機関をすっきりさせました。その結果、予算の使い過ぎを防げました。また、地方行政機関の暴走を防ぐため地方監察官[観察使]各1名を畿内七道に4年間採用しました。
809年、平城天皇の容体悪化から弟の嵯峨天皇に譲りました。その後、平城太上天皇[平城上皇]として平城京で闘病生活を送っていました。平城上皇の容体が回復すると、平城京で嵯峨天皇の政策方針に口を出すようになりました。平城上皇の側近などが平城京に移りました。その結果、嵯峨天皇〔平安京〕と平城上皇〔平城京〕それぞれが政策方針を出しました(二所朝廷)。<gallery mode="nolines" widths="250" heights="250">
ファイル:Emperor Saga large.jpg|嵯峨天皇
ファイル:Emperor Heizei-colord.jpg|平城天皇
ファイル:The prince Takaoka.jpg|高岳親王
</gallery>藤原薬子〔藤原種継の娘〕と藤原仲成〔藤原薬子の兄〕が平城太上天皇の側近としていました。平城上皇は藤原式家の藤原薬子・藤原仲成と手を組み、律令政権の中心を平城京に戻そうとしました。
やがて、新価値観側の嵯峨天皇は旧価値観側の平城上皇と施策方針を巡って争うようになりました。810年、新価値観側の秘密が旧価値観側に漏れないように新しい役所[蔵人所]を作りました。新しい役所[<span style="color:#f29100">'''蔵人所'''</span>]の代表者[<span style="color:#f29100">'''蔵人頭'''</span>]は2名選ばれ、蔵人所の初代蔵人頭として<span style="color:#f29100">'''藤原冬嗣'''</span>と巨勢野足を選びました。
蔵人所は現在の宮内庁書陵部と同じように大事な文書・秘密資料を保管して、天皇の公務を止めないようにしました。また、宮内庁式部職と同じように宮中行事の準備・来客応対・文書・打ち合わせまで行うようになりました。蔵人は天皇の側近として大事なお話にも関わるようになり、やがて蔵人頭から参議へ昇格するようになりました。
810年、嵯峨天皇は平城太上天皇の平城京朝廷復帰を許しませんでした。その後、嵯峨天皇は東国流出を防ぐため、伊勢・近江・美濃の通路を塞ぎました。健児も入れて不審者の平安京侵入を防ぎました。こうして新価値観側は藤原仲成の平安京侵入に素早く気づいて殺しつつ、尚侍の藤原薬子も首にしました。平城太上天皇は東国へ逃げようとしても新価値観側の坂上田村麻呂などに囲まれて、平城京へ帰ってから出家しました。藤原薬子は毒を飲んで亡くなりました(<span style="color:#f29100">'''平城太上天皇の変'''</span>)。
従来、藤原薬子と藤原仲成が無罪の平城太上天皇を操り人形として動かしており、平城太上天皇のみ当事件に関わっていないから「薬子の変」とよばれていました。しかし、最新の歴史学文献から平城太上天皇も当事件に大きく関わっており「平城太上天皇の変」に変わりました。当事件後、嵯峨天皇は政策方針を出して二所朝廷も終わりました。また藤原式家は政治にほとんど出なくなり、蔵人頭の意見を取り入れるようになりました。
当事件後、高岳親王[平城太上天皇の息子]は皇太子の地位を失いました。その後の高岳親王は出家して真如と名乗り、空海から学ぶようになりました。仏教の教えをもっと深く学ぶために唐へ渡っても、当時の唐は仏教の指導者もほとんどいませんでした。そのため、さらに西の天竺[現在のインド]へ向かいました。高丘親王はマレー半島付近[シンガポール付近]で亡くなり、約16年後に日本へ現地のご逝去も届きました。
816年、嵯峨天皇は蔵人所創設に引き続き左衛門府と右衛門府へ<span style="color:#f29100">'''検非違使'''</span>を入れました。検非違使は現在の警視庁みたいに犯人[盗賊など]を捕まえたり、不審者を見つけたり、事件を調べたりしました。その後、新しい独立官司として検非違使庁を作り、現在の検察庁業務と裁判所業務まで担うようになりました。
[[ファイル:Kyowogokokuji Monastery Tobatsu Bishamonten (280).jpg|サムネイル|241x241ピクセル|兜跋毘沙門天(教王護国寺)]]
各律令官司[衛門府・弾正台・刑部省・京職・六衛府]の業務内容も少しずつ検非違使が引き取りました。衛門府[警察署地域課の業務内容]・弾正台[警察署警務課の業務内容]・刑部省[警察署刑事課の業務内容]・京職[警察署生活安全課の業務内容]・六衛府[警察署警備課の業務内容]を検非違使が行うと、現在の警視庁みたいな組織になりました。なお、地方は地方警察の国検非違使をいれ、検非違使庁の長官は別当として特別扱いされるようになりました。また、一部の元受刑者は放免[捜査協力者]にもなっています。
このように、平安時代初期の朝廷は政策を行いやすいように従来の官職・官司を減らしたり、類似の官職・官司をまとめたりしました。また、新しい業務内容に取り組むため、新しい官職・官司[<span style="color:#f29100">'''令外官'''</span>]も導入しました。勘解由使〔桓武天皇〕・蔵人所〔嵯峨天皇〕・蔵人頭〔嵯峨天皇〕・検非違使〔嵯峨天皇〕・中納言・参議・内大臣・征夷大将軍・押領使・追捕使などは令外官になります。内大臣は左大臣・右大臣に次いで3番目の上司でした。令外官は律令制度を引き続き取り入れつつ新しい政策を行いやすいように導入されました。
嵯峨天皇の子供は約50人もいました。子供全員を皇族関係者として扱うとパンクしやすいので、大半の息子と娘は名字の源朝臣を付けて一般人として生活させました。
なお、平安京南端の羅城門は敵の侵入を防ぐために毘沙門天像を置いたかもしれません。現在、教王護国寺(東寺)の伝兜跋毘沙門天立像は高さ約1.9mあり、中国の唐で作られたのかもしれません。羅城門の伝兜跋毘沙門天立像が教王護国寺(東寺)へ引っ越しして羅城門の旧像を置いたのかもしれません。
== 法・儀式の整備と教育 ==
朝廷は昔ながらの大宝律令・養老律令を守りながら、古い条文を新しい条文に直しました。この時、新しい条文として<span style="color:#f29100">'''格'''</span>と<span style="color:#f29100">'''式'''</span>が使われました。格は現代法律の第α項に当たり、詔勅・太政官官符なども格に入りました。式は現代法律の第α号に当たり、条件・対象を細かく分けました。しかし、格と式は何度も出され、大宝律令・養老律令も読みにくくなりました。平安時代初期の朝廷は大量の格と式を整理して、法令集にまとめるようになりました。
== 資料出所 ==
* 平雅行、横田冬彦ほか編著『日本史探究』実教出版株式会社 2023年
* 佐藤信、五味文彦ほか編著『詳説日本史探究』株式会社山川出版社 2023年
* 渡邊晃宏ほか編著『日本史探究』東京書籍株式会社 2023年
* 伊藤純郎ほか編著『高等学校日本史探究』株式会社清水書院 2023年
* 大橋幸泰ほか編著『高等学校日本史探究』株式会社第一学習社 2023年
* 山中裕典著'''『'''改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本'''』'''株式会社KADOKAWA 2024年
* 佐藤信、五味文彦ほか編著『詳説日本史研究』株式会社山川出版社 2017年
* 河合敦著『世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座』株式会社KADOKAWA 2014年(絶版本)
* 外園豊基編集代表『最新日本史図表』株式会社第一学習社 2026年
* 東京法令出版編著『歴史資料館 日本史のライブラリー』東京法令出版株式会社 2026年
== ここに注意!! ==
[[カテゴリ:高等学校日本史探究]]
[[カテゴリ:平安時代]]
ol9ju6fqe1ufrjsod35ak1rnoxda4bb