BitVisor 2017年の主な変更点

Similar documents
BitVisor Updates in 2016

第6期末セミナー2006-1rev1.ppt

今週の進捗

BitVisor 2017年の主な変更点

Microsoft PowerPoint - install_NGSsokushu_windows(ver2.1).pptx

TFTP serverの実装

スライド 1

セキュアVMの アーキテクチャ概要

bitvisor_summit.pptx

スライド 1

PowerPoint プレゼンテーション

CR-UK1ソフトウェアユーザーズガイド

04-process_thread_2.ppt

Xen 3.0 のすべて 内部実装詳解 VA Linux Systems Japan K.K. 山幡為佐久 Linux Kernel Conference

remotewol-configuration-userguide

スライド 1

目次 1 VirtualBoot for Hyper-V とは バックアップを実行するマシンの設定 確認すべきこと SPX によるバックアップ VirtualBoot for Hyper-V を実行するマシンの設定 確

SetupVerup_dl_M

常駐接続(ISL AlwaysOn)Wake On LAN 設定ガイド

MMUなしプロセッサ用Linuxの共有ライブラリ機構

リモートオペレーションキット ユーザーズガイド

準パススルー型VMM開発の難しいところ

利用ガイド

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

Microsoft PowerPoint - IO_Pass-through_XenSummitTokyo2008_jp.ppt

momentum Probe Type-R/C version 4.21 build-a04a Release Notes Release Version: momentum Probe Type-R/C version 4.21 build-a04a Release Date: 2018/06/2

CLUSTERPRO MC ProcessSaver 1.2 for Windows 導入ガイド 第 4 版 2014 年 3 月 日本電気株式会社

LINE WORKS 管理者トレーニング 4. セキュリティ管理 Ver 年 6 月版

新OS使用時の留意事項

ESMPRO/ServerManager Ver. 6 変更履歴

2.RL78 での割り込み処理 ( 割り込み受け付け ) マスクが解除された (xxmk ビットが 0 の ) 割り込み要求信号は 2 つの用途で使用されます 一つ目は,CPU のスタンバイ状態の解除です この動作は, 割り込み優先順位とは全く無関係で, マスクされていない (xxmk=0 の )

Windows Server 用 HDJ-HSU シリーズアンロックユーティリティ SHGate Service 取扱説明書 SHGate Service は サーバー機に接続されたセキュリティハードディスク HDJ-HSU シリーズ にパスワードを登録することで サーバー起動時や HDJ-HSU

SiTCP ユーティリティユーザガイド 2014 年 6 月 18 日 0.73 版 Bee Beans Technologies 1

Microsoft PowerPoint - kougi7.ppt

スライド 1

現象 3 仮想マシン起動時に イベントログ ( システムログ ) に以下の警告イベントが登録される 種類 : 警告ソース :VMSMP イベント ID:27 " 任意の仮想マシン名 " のネットワーキングドライバーが読み込まれましたが サーバーからの別のバージョンが含まれています サーバーバージョン

Microsoft Word - 【重要】ASM200_V4.10バージョンアップ手順rev2.docx

■POP3の廃止について

ServerView RAID Manager VMware vSphere ESXi 6 インストールガイド

Microsoft Word - ssVPN MacOS クライアントマニュアル_120版.doc

SigmaSystemCenter 仮想マシンサーバ(ESX)のIPアドレス変更手順(SSC3.0~3.5u1)

5400 エミュレーターII 構成の手引き(第6章 トラブルシューティング)

複数の Nios II を構成する際の注意事項

2013年『STSSスキルコミュニティ』 テーマ別Kickoff資料

1. 概要 この章では HDE Controller X LG Edition をお使いの方に向けて LGWAN 接続に特化した設定の説明をします HDE Controller X LG Edition 以外の製品をご利用のお客様はこの章で解説する機能をお使いになれませんのでご注意ください 452

『テクノス』V2プログラムインストール説明書

ARES 2018

Microsoft PowerPoint - DEXCS2015_Salome_Installation pptx

Microsoft Word - qa-int.doc

リンクされたイメージを表示できません ファイルが移動または削除されたか 名前が変更された可能性があります リンクに正しいファイル名と場所が指定されていることを確認してください ここでは昨年までにいただいたご質問で多かったものについて その回答をまとめてあります 各種調査書様式の操作 Q12 調査書様

Microsoft PowerPoint - OS07.pptx

<< 目次 >> 1 PDF コンバータのインストール ライセンスコードの入力 PDF にフォントを埋め込みたい場合の設定 PDF オートコンバータ EX で使用しない場合 PDF コンバータ単体で使用する場合の説明 PDF コンバータのアン

ARES 2018

Microsoft Word - TestReport_PRIMEPOWER250_ doc

ネットワーク設置で困ったときには

Microsoft Word - XPC4ソフトマニュアル.doc

Monthly Research / セキュアハードウェアの登場とその分析

CLUSTERPRO MC StorageSaver 2.2 for Linux リリースメモ 2017(Apr) NEC Corporation ライセンス パッケージのインストール セットアップ マニュアル 補足事項 注意事項

OmniTrust

memcached 方式 (No Replication) 認証情報は ログインした tomcat と設定された各 memcached サーバーに認証情報を分割し振り分けて保管する memcached の方系がダウンした場合は ログインしたことのあるサーバーへのアクセスでは tomcat に認証情報

Microsoft Word - PC0502_090925_IPアドレスの設定.doc

ユーザーズガイド Brother Meter Read Tool JPN Version 0

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

提案書

The Current Status of BitVisor 1.5(仮)

EX AntiMalware v7 クイックセットアップガイド A7QG AHK-JP EX AntiMalware v7 クイックセットアップガイド 本製品の動作環境です OS 下記 OS の 32 ビット 64 ビット (x64) をサポートします Windows 10, 8.1,

PDFオートコンバータEX

延命セキュリティ製品 製品名お客様の想定対象 OS McAfee Embedded Control 特定の業務で利用する物理 PC 仮想 PC や Server 2003 Server 2003 ホワイトリスト型 Trend Micro Safe Lock 特定の業務で利用するスタンドアロン PC

TeamViewer 9マニュアル – Wake-on-LAN

2

Ver26 メディアマート株式会社 アドバンスト アナリティクス株式会社 Statistics 26.0 のインストール手順書 (Windows 版 ) Authorized User ライセンス ( シングルライセンス ) 1. 事前に IBM SPSS Statistics 26 をインストール

Transcription:

BitVisor 2018 年の主な変更点 榮樂英樹 株式会社イーゲル 2018-11-28 BitVisor Summit 7 1

BitVisor 2018 年の主な変更点 バグ修正 NMI 関連の問題 IA32_TSC_ADJUST MSRの変更未対応 シャドウページテーブルの正しくないfast path タスクスイッチ時の命令ポインター更新忘れ XSS-bitmap exiting 未初期化 仮想マシン上でBitVisorを動作させる場合の問題 機能追加 (*) 昨年の BitVisor Summit 6 で発表された機能の取り込み PCID 対応 dbgsh 用 telnetサーバー追加 Realtek NIC+virtio-net 対応 NVM Express 対応 (*) Intel VT-x 用 unsafe nested virtualization 対応 (*) その他細かな修正 2

バグ修正 : NMI 関連の問題 (NMI: Non-Maskable Interrupt) NMI 生成が遅れる NMI ブロック中の NMI を正しく処理しない NMI ハンドラーがプロセス ( 保護ドメイン ) の %gs 変更を想定していない NMI がプロセスのシステムコールの直後に発生することを想定していない 3

仮想マシン動作時の制御の流れ ゲストモード / VMX non-root operation 割り込み I/O など #VMEXIT VMM VMRUN 命令など 4

今までも OK だった NMI (1) NMI による #VMEXIT ゲストモード / VMX non-root operation NMI #VMEXIT Injecting NMI VMM NMI NMI チェック VMRUN 命令など 5

今までも OK だった NMI (2) NMI チェック前の NMI ゲストモード / VMX non-root operation I/O など #VMEXIT Injecting NMI VMM NMI NMI チェック VMRUN 命令など 6

NMI 生成が遅れる問題 (1) NMI チェック後の NMI 次の #VMEXIT まで inject されない ゲストモード / VMX non-root operation I/O など #VMEXIT VMM NMI チェック VMRUN 命令など NMI 7

NMI 生成が遅れる問題 (2) Event Injection の競合 次の #VMEXIT まで inject されない ゲストモード / VMX non-root operation 割り込み #VMEXIT Injecting 割り込み VMM NMI NMI チェック VMRUN 命令など 8

NMI 生成が遅れる問題の具体例 : Windows 再起動でのハングアップ 1. Windows が再起動の際に CPU0 から NMI を送信し他のプロセッサの応答を待つ 2. CPU1 がたまたま割り込み #VMEXIT の処理中で NMI 生成が遅れる 3. CPU1 の Windows が 割り込み処理後 ( おそらく )NMI を待つため割り込み禁止にして MWAIT 命令を実行する 4. CPU1 は二度と #VMEXIT することはなく動作を停止する 5. CPU0 は CPU1 の応答を待ち続け無限ループに陥る 9

NMI 生成が遅れる問題の対策 (1) NMI チェック後の NMI VMRUN/VMLAUNCH/VMRESUME 直前にNMIをチェックし あれば中止する ゲストモード / VMX non-root operation I/O など #VMEXIT 直前 NMI チェック VMM NMI チェック NMI 10

VMRUN/VMLAUNCH/VMRESU ME 直前に NMI をチェック 競合を避ける必要がある AMD SVM の場合 : CLGI 命令で NMI をマスク (?) してチェックする マスク中に NMI が発生した場合は VMRUN でマスク解除されるためその直後に #VMEXIT となる Intel VT-x の場合 : NMI ハンドラー内で スタック上のリターンアドレスを見て VMLAUNCH/VMRESUME 直前のアドレス範囲の場合は NMI 用のアドレスに書き換えるようにする そのアドレス範囲内で NMI をチェックする 11

NMI 生成が遅れる問題の対策 (2) Event Injection の競合 直後に #VMEXITさせる( 本来 NMIの優先度が高いが 割り込みを受け付けてしまっているので難しい ) ゲストモード / VMX non-root operation 割り込み #VMEXIT Injecting 割り込み 何らかの #VMEXIT VMM NMI NMI チェック VMRUN 命令など 12

直後に #VMEXIT させる方法 AMD SVM の場合 良い方法がなかったので HLT/MWAIT/PAUSE の各命令の intercept を有効にして Windows の具体例については対策する Intel VT-x の場合 NMI-window exiting を使用する NMI 生成可能な状況になればすぐに VM exit される 13

NMI ブロック中の NMI を正しく処理 しない問題 NMI ハンドラーが呼び出されてから IRET 命令が実行されるまでに発生した NMI はブロックされる (80286 以降 ) ここでは NMI ハンドラーが呼び出されてから IRET 命令が実行されるまでを NMI ブロック中と表す これまでの BitVisor の動作 : Intel VT-x: NMI ブロック中の NMI は失われる (IRET 後も生成されない ) AMD SVM: NMI ブロック中の NMI は生成される ( もし NMI ハンドラーとしてタスクスイッチが設定されていれば不正なタスクスイッチで例外発生の原因に ) 14

NMI ブロック中の NMI を正しく処理 しない問題の対策 (Intel VT-x) VMCS 内に Blocking by NMI というビットがあり NMI ブロック中はこれがセットされている これまで Blocking by NMI がセットされていると NMI を破棄していた Blocking by NMI がセットされているときに NMI を破棄するのではなく NMI-window exiting をセットすることで IRET 命令の直後に VM exit させて NMI を生成することができる 15

NMI ブロック中の NMI を正しく処理 しない問題の対策 (AMD SVM) NMI ブロック中は IRET 命令の intercept を有効にし それが有効の間は NMI 生成をブロックする IRET 命令の #VMEXIT でブロックを解除したいが 実際には IRET の次の命令までは次の NMI は生成できない しかし IRET 命令のエミュレーションは面倒 ( 特にタスクスイッチ ) そのため IRET 命令時点で intercept を無効にしたうえで IRET 命令で外部割り込みが発生するのを避けるため interrupt shadow をセットし NMI 生成が必要な場合は HLT/MWAIT/PAUSE の各命令の intercept を有効にしてお茶を濁す 16

NMI ハンドラーがプロセスの %gs 変更を想定していない %gs をいきなり使っていたため プロセス ( 保護ドメイン ) が別のセグメントをロードすれば不正なアドレスへのアクセスをすることになっていた %gs をセットしてから使うようにして解決 17

NMI がプロセスのシステムコールの直後に発生することを想定していない 64bit では SYSCALL 命令によるシステムコールを使用していた SYSCALL 命令はスタックポインターを切り替えない BitVisor は NMI ハンドラーがスタックを切り替えるよう設定していない SYSCALL 命令の直後に NMI が発生するとプロセスのスタックのまま NMI ハンドラーが実行されるおそれがあった 64bit コールゲート対応を実装し SYSCALL はデフォルトでオフになるようにした (CONFIG_USE_SYSCALL64) QEMU では 64bit コールゲートが実装されていないらしく エラーが出るようになった... 18

バグ修正 : IA32_TSC_ADJUST MSR の変更未対応 IA32_TIME_STAMP_COUNTER MSR: TSC そのもの IA32_TSC_ADJUST MSR: 基準となる TSC との差 BitVisor の処理 : IA32_TIME_STAMP_COUNTER MSR の変更 : 実際の TSC は変更せず その時点の TSC との差を TSC offset にセットする IA32_TSC_ADJUST MSR の変更 : 実際の TSC は変更せず 与えられた値を TSC offset にセットする この実装がなくパススルーされてしまったために実際の TSC が変更されてしまい BitVisor 内の時刻情報がおかしくなっていた 19

バグ修正 : シャドウページテーブル の正しくない fast path CONFIG_CPU_MMU_SPT_3( デフォルト ) 使用時 ゲスト OS が CR0 CR3 CR4 EFER の各レジスターを変更せずに TLB フラッシュした場合 PTE PDE の変更のあった部分だけを反映する fast path が実装されていた この fast path では PDPTE PML4E の変更が反映されず 再利用されたため正常に TLB フラッシュできていなかった 正しくない fast path だったので削除した 見つかった経緯 : BitVisor 上で BitVisor を起動して NMI 問題の実験中 たまたま Core 2 Duo の PC を使用したところプロセスが異常終了したことで発覚 BitVisor のプロセスの空間は CR3 ではなく PDPTE の変更により切り替えられていたため 完全に上の条件を満たしていた 20

バグ修正 : タスクスイッチ時の命令 ポインター更新忘れ タスクスイッチ時に命令ポインターを進めていないバグが NMI 問題の調査中に発見された タスクスイッチの種類 : JMP, CALL, 割り込み IRET 命令ポインターを進めてはいけないもの : 外部割り込み NMI, INT3 INTO 以外の例外 命令ポインターを進めなければならないもの : JMP, CALL, ソフトウェア割り込み (INT) INT3 INTO による例外, IRET 修正した Intel VT-x: 命令長は VMCS から取得 INT3 INTO は ソフトウェア例外 として区別 AMD SVM: 命令長は機械語を読み取って解釈 INT3 INTO は例外の割り込み番号により区別 21

バグ修正 : XSS-bitmap exiting 未 初期化 XSAVES/XRSTORS 命令対応の際に XSS-bitmap exiting を初期化していなかったことが分かった Windows のシャットダウン時に XSAVES 命令による VM exit で panic が発生したことで発覚 XSS-bitmap exiting を 0 クリアするようにした 22

バグ修正 : 仮想マシン上で BitVisor を動作させる場合の問題 On Linux KVM KVM の拡張機能による予期しないページフォールト 外部割り込み生成時の VM entry failed panic 23

KVM の拡張機能による予期しな いページフォールト Linux KVM の拡張機能で asynchronous page fault というのがあって その機能によりページフォールトが BitVisor 内の予期しないタイミングで発生してしまうことが判明した BitVisor 内の外部割り込み受付処理 sti nop cli ; ここでページフォールトが発生 BitVisor はこれを外部割り込みの 14 が発生したものとして処理してしまい オペレーティングシステムが正常に動作できなくなる CPUID でハイパーバイザーの拡張用に使われる 0x40000000-0x4FFFFFFF を隠ぺいすることにより解決 24

外部割り込み生成時の VM entry failed panic (1/2) BitVisor が外部割り込みを inject しようとしたときに Intel VT-x の blocking by STI がセットされていると VM entry failed panic が発生する (on Linux KVM) Blocking by STI について : sti nop cli ; ここで割り込みを許可 ; ここでは割り込みは発生しない (Blocking by STI) 今まで発覚しなかったのはなぜか BitVisor は割り込みか interrupt window の VM exit で割り込みを inject していた Interrupt window は blocking by STI では発生しない仕様である 実際の CPU は おそらく blocking by STI の状態では割り込みによる VM exit をしないのではないか 25

外部割り込み生成時の VM entry failed panic (2/2) Blocking by STI チェックのために 割り込み VM exit に関する処理を書き直した 仮想マシンがパススルーかどうかを示すフラグを追加し VTx/SVM 実装側にパススルー処理を実装した Intel VT-x 割り込み VM exit: 仮想マシンの割り込み許可状態にかかわらず発生 Interrupt-window exiting をセットする Blocking 等の条件が合えばすぐに割り込みを inject する Interrupt window VM exit 割り込みを inject する AMD SVM 割り込み #VMEXIT: 仮想マシンが割り込み許可状態で割り込みを受け付ける直前に発生 すぐに割り込みを inject する 26

機能追加 : PCID 対応 Intel CPU における Meltdown 脆弱性 (CVE-2017-5754) の対策において 性能低下を抑える目的で PCID を活用するオペレーティングシステムが 2018 年に急増したため BitVisor の PCID 対応を行った EPT と Unrestricted guest が有効 かつ PCID が使用可能な時に限り PCID 使用可能とし INVPCID も対応していれば使用可能とした 今のところ シャドウページテーブルを使う可能性がある環境と AMD SVM では使用可能にしていない 27

機能追加 : dbgsh 用 telnet サーバー追加 lwip を用いた簡単な telnet サーバーを実装し それを用いて遠隔から dbgsh にアクセスできる機能を追加した 有効化方法 : vmm.telnet_dbgsh=1 有効化されていれば panic の際にもシェル起動の代わりに telnet mode と出力してネットワーク通信ができる状態で停止する ネットワークデバイスと lwip が使用可能でなければ何もできなくなる 複数セッションには対応せず 二つ目の接続があれば最初の接続は切断される 28

機能追加 : Realtek NIC+ virtio-net 対応 FreeBSD 用 Realtek NIC ドライバーを BitVisor に移植し virtio-net 化して使用できるようになった 有効化方法 : CONFIG_NET_RE=1 vmm.driver.pci=driver=re, virtio=1 tty=1 もつけるとネットワークログ出力機能が使用可能 net=ippass 等の指定により lwip 等が使用可能 OpenSSL などと同様に 移植したモジュールはライセンスが異なるため make config で切り離してビルドできるようにして デフォルトではオフにしてある 29

機能追加 : NVM Express 対応 昨年の BitVisor Summit 6 で発表された機能の取り込み 有効化方法 : 通常の NVMe デバイス用 : vmm.driver.pci=driver=nvme 一部コンピューター向け NVMe デバイス用 : vmm.driver.pci=driver=nvme_apple 30

機能追加 : Intel VT-x 用 Unsafe Nested Virtualization 対応 昨年の BitVisor Summit 6 で発表された機能の取り込み 一部改良や問題対策等の修正を行った 31

Intel VT-x 用 Unsafe Nested Virtualization 対応修正内容概要 VMCS shadowing 対応 Intel NIC+virtio-net の割り込み番号変換対応 VPID は BitVisor の VM だけが使い 他は VPID=0 を使う VMFUNC 機能隠ぺい バグ修正 VMCLEAR, VMPTRLD, INVEPT, INVVPID, VMWRITE, VMREAD および VMXOFF 命令のエラーを示すフラグの設定 Host states のセグメント周りの反映処理 EFER を VMCS に設定できない Core 2 Duo での panic 抜けていた処理 : VMPTRST 命令 CPL チェック リセット処理 VMLAUNCH または VMRESUME 命令での MOV SS エラーと VM entry failure エラーを返す処理 NMI 対応 32

VMCS Shadowing 対応 VMREAD/VMWRITE による VM exit を減らし高速化 Host states よく使われる guest states と 可能であれば read-only fields を shadow に保持し VM entry/exit の際に必要なものをコピー BitVisor VMCS 0 Shadow-VMCS indicator 1 VMCS link pointer Shadow VMCS 0 Guest Current VMCS BitVisor host states BitVisor guest states and readonly fields Host states Guest statesの一部 Read-only fieldsの一部 BitVisor host states Guest states の一部 Read-only fields の一部 VMPTRLD/VMCLEAR でコピー VMPTRLD/VMCLEAR/VMLAUNCH/VMRESUME でコピー VM exit なし 33

VMCS Shadowing 対応 ( 仮想マシンに対して ) 仮想マシン上でもVMCS shadowingが使われる場合 shadow-vmcs indicatorが1になっているvmcsは VMLAUNCH/VMRESUMEに使われることはないため すべてをVM exitなしで扱う BitVisor VMCS 0 Shadow-VMCS indicator 1 VMCS link pointer BitVisor host states BitVisor guest states and readonly fields Guest Current VMCS Shadow VMCS VM exit なし 34

Intel NIC+virtio-net の割り込み 番号変換対応 (1/2) Intel VT-x の "Acknowledge interrupt on exit" 機能 無効の時は 割り込みで VM exit した後 割り込み許可にした時に 割り込み番号に対応する割り込みハンドラーが呼び出される 有効の時は 割り込みで VM exit した時に VM-exit interruption information に割り込み番号が入る Linux KVM はこれを有効にしている Intel NIC+virtio-net 使用時に影響 Intel NIC+virtio-net 機能は MSI で割り込み番号 16~31 を使用し 仮想マシンに対して割り込み番号を変換している KVM 上の VM 動作中に割り込み 16 が発生すると BitVisor に戻ってきた時点で割り込み 16 は受付済みであり 放っておくと KVM が割り込み 16 を生成して fpu exception になってしまった 35

Intel NIC+virtio-net の割り込み 番号変換対応 (2/2) VMCS の VM-exit interruption information に含まれる割り込み番号を書き換える必要がある Read-only fields のひとつで 古い CPU では書き換えができない 書き換えができる場合は素直に書き換える 書き換えができない場合は値をとっておき次の VMREAD の時に正しい値を返す VMPTRLD で別の VMCS に切り替えられた場合や VMCLEAR が使用された場合には対応できない 割り込み VM exit だからすぐに読み取って処理してくれるだろうという淡い期待に基づいている 割り込みをなかったことにすることは難しい とりあえず VM-exit interruption information の valid ビットをクリアするようにしたが 矛盾が生じている 36

その他細かな修正 INIT signal 処理のリファクタリング リセット処理で設定し忘れていたステートやレジスターの設定 strcmp/memcmp で setnc/setc/ror の代わりに sbb/xor を使用 mapmem 失敗時のアンロック 32bit ビルド版で mapmem 領域を増やした (PCI MMCONFIG のマップ失敗対策 ) 32bit ビルドエラー修正 gs_* 定義削除 cpu_seg_*() 関数を long mode でも使用可能に VT-x: DEBUGCTL MSR のアクセスを VMCS に反映 lwip を 2.0.3 に更新 Intel GbE NIC: リンクアップ時のみ送信 デバイス 15e3/156f 追加 bnx hotplug パススルー機能追加 debug dump 長さ指定機能追加 strncmp() 追加 SMX 隠ぺい 新 Mac 対応 ストレージの暗号化と I/O の分離 EFER を 64bit 幅でアクセス UEFI: リンク時 --subsystem 使用 UEFI: DisconnectController 改良 SVM: SVM-Lock 隠ぺい / unsafe nested virtualization の config チェックを MSR 処理内で行う 37

BitVisor 2018 年の主な変更点まとめ バグ修正 NMI 関連の問題 IA32_TSC_ADJUST MSRの変更未対応 シャドウページテーブルの正しくないfast path タスクスイッチ時の命令ポインター更新忘れ XSS-bitmap exiting 未初期化 仮想マシン上でBitVisorを動作させる場合の問題 機能追加 (*) 昨年の BitVisor Summit 6 で発表された機能の取り込み PCID 対応 dbgsh 用 telnetサーバー追加 Realtek NIC+virtio-net 対応 NVM Express 対応 (*) Intel VT-x 用 unsafe nested virtualization 対応 (*) その他細かな修正 38