Go to main content

マニュアルページ セクション 8: システム管理コマンド

印刷ビューの終了

更新: 2018年8月8日
 
 

sxadm (8)

名前

sxadm - Solaris セキュリティー拡張の構成の管理

形式

sxadm enable [-c property=value[,property=value,...]]
     extension[,extension,...]
sxadm exec [-i] [-s extension=value],... command
sxadm delcust [extension,...]
sxadm disable extension[,extension,...]
sxadm get [-p -o field[,...]] property[,...] [extension]
sxadm help [subcommand]
sxadm set property=value[,property=value,...] extension
sxadm status [-p -o field[,...]] [extension]

説明

sxadm コマンドは、Solaris セキュリティー拡張を構成し、関連する情報を提供します。

sxadm exec サブコマンドを使用すると、特定のコマンドのセキュリティー拡張を有効または無効にできます。これらの拡張は関連付けられたプロセスに適用され、–i オプションを使用することで任意の子プロセスで継承できます。「セキュリティー拡張」を参照してください。

その他すべての sxadm サブコマンドは、システムレベルのセキュリティー拡張に関する情報を構成して提供します。これらの拡張は、大域ゾーンと非大域ゾーンの両方に適用されます。

プロセスのセキュリティー拡張は exec(2) によって決定され、その時点からプロセスに対して有効になります。拡張は、プロセスが終了するか、再度 exec(2) を呼び出すまで、プロセスの有効期間の間持続します。システムレベルの拡張はすべてのプロセスに影響を与えます。プロセスレベルの拡張は、個々のプロセスに影響を与え、子プロセスが特権プロセスでない場合はすべての子プロセスによって継承されます。「セキュリティー拡張」を参照してください。

個々の実行可能ファイルには、ld(1) で構築する際に、セキュリティー拡張の要件をタグ付けできます。このタグ付けにより、システムレベルの拡張にかかわらず、関連付けられたプロセス要件が確実に満たされます。セキュリティー拡張がタグ付けされている実行可能ファイルは、プロセスレベルの拡張でオーバーライドできます。「実行可能ファイルにタグ付けされる拡張」を参照してください。

セキュリティー拡張は、境界線の動作を制約する防御を提供することでアプリケーションを制限します。その結果、セキュリティー拡張の適用時に、既存の一部のアプリケーションで障害が発生するか、パフォーマンスが低下する可能性があります。通常、防御が新しいほど、アプリケーションで障害が発生する可能性が高くなります。ある種類の保護が徐々に主流になるにつれて、プログラミングの実践が影響を受け、セキュリティー拡張の適用が原因の障害は少なくなります。

セキュリティー拡張

次のセキュリティー拡張が使用可能です。これらの拡張は、攻撃者が既知のエントリポイントを見つけたり、あとで実行される場所に攻撃用コードを埋め込んだりする可能性を減らします。

ASLR - アドレス空間レイアウトのランダム化

ASLR は、スタック、brk ベースのヒープ、メモリーセグメントマッピングなどのプロセスの重要な部分のランダム化をアクティブにします。位置独立実行可能ファイルとして構築されたアプリケーションのメモリーマッピングも、ASLR でランダム化されます。

NXHEAP - 実行不能ヒープ

NXHEAP は、プロセスヒープに割り当てられたページが実行可能になることを防ぎます。

NXSTACK - 実行不能スタック

NXSTACK は、プロセススタックに割り当てられたページが実行可能になることを防ぎます。旧バージョンの /etc/system, noexec_user_stack および noexec_user_stack_log 設定との下位互換性は維持されていますが、このような制御は非推奨であり、代わりに sxadm を使用するようにしてください。

ADIHEAP - ヒープアロケータ用の ADI ベースの保護

Application Data Integrity は、SPARC M7 プロセッサで導入された機能で、メモリーの範囲を一意の識別子でタグ付けできるようにします。adi(3C) を参照してください。これらの識別子を使用して、一致しない識別子を持つポインタによる無効な読み取りと書き込みを自動的に検出できます。ヒープアロケータはこの機能を使用して、隣接するバッファーオーバーフローを確実に検出し、浮遊ポインタと use-after-free に対して統計的に防御できます。

ADI は強力なテクノロジですが、低レベルアドレス計算を実行するアプリケーションと互換性がない場合があります。特に、ポインタがタグ付けされるため、ポインタ数学に依存するアプリケーションはまずポインタを正規化する必要があります。さらに、バッファー制限を超えたアクセスも、致命的として検出されます。一部のアプリケーションでは、これらのアクセスを意図的な最適化として使用することがわかっており、ADI では障害が発生する可能性があります。アプリケーションがメモリーチェッカー (valgrind など) 下で正常に実行された場合、これらの問題が発生する可能性はほとんどありません。これらの理由で、ADIHEAP の「all」モデルはサポートされておらず、バイナリタグによって ADIHEAP を有効にするアプリケーションのテスト中は特別な注意を払ってください。

ADIHEAP 拡張は特定のメモリーアロケータ、および ADI をサポートする SPARC システムでのみ使用できます。

ADISTACK - スタック用の ADI ベースの保護

Application Data Integrity は、SPARC M7 プロセッサで導入された機能で、メモリーの範囲を一意の識別子でタグ付けできるようにします。adi(3C) を参照してください。これらの識別子を使用すると、保存領域に有効な内容が含まれている場合に、スタックフレームのレジスタ保存領域を上書きするバッファーオーバーフローを自動的に検出できます。

一部のアプリケーションまたはインタプリタ型言語では、意図的に独自のスタックが直接読み取られるか変更されることがあります。この理由で、ADISTACK の「all」モデルはサポートされておらず、バイナリタグによって ADISTACK を有効にするアプリケーションのテスト中は特別な注意を払ってください。

ADISTACK 拡張機能は、ADI をサポートする SPARC システムでのみ使用できます。

KADI - カーネルヒープ用の ADI ベースの保護

KADI は、Application Data Integrity を使用してカーネルヒープ内のメモリー破損を取得します。KADI は、バッファーオーバーフロー、解放済みメモリーの使用、再割り当て済みメモリーの使用、および二重解放に対する保護を提供します。

変更を有効にするには、KADI を有効または無効にしたあとにリブートが必要です。

デフォルトでは、大域ゾーンおよびすべての非大域ゾーンで、ASLRNXHEAPADIHEAP、および ADISTACK 拡張はタグ付けされたバイナリに対してのみ有効になり、NXSTACK 拡張はすべてのプロセスに対して有効になります。

セキュリティー拡張のプロパティー

セキュリティー拡張には 1 つ以上のプロパティーを設定できます。すべての拡張に model プロパティーがあります。このプロパティーは、拡張が適用される対象を定義します。次の model プロパティーがあります。

model=all

すべてのプロセスに対してセキュリティー拡張を有効にします。

model=tagged-files

タグ付けされているバイナリに対してセキュリティー拡張を有効にします。

model=default

セキュリティー拡張システムのデフォルトに従います。「セキュリティー拡張」を参照してください。

セキュリティー拡張に追加のプロパティーが存在する場合もあります。

NXHEAP および NXSTACK にはロギングプロパティーがあり、これが有効になっている場合、実行不能なメモリー範囲 (NXSTACK の場合はスタック、NXHEAP の場合はヒープとデータ) から実行が試行されると報告されます。

log=enable

ロギングを有効にします。

log=disable

ロギングを無効にします。(デフォルト構成)

セキュリティー拡張の管理

sxadm のサブコマンド enabledisableset、および delcust を使用すると、システム全体のセキュリティー拡張を変更できます。たとえば、次の sxadm コマンドは、拡張をシステム全体で有効にします。

# sxadm enable nxstack
# sxadm enable aslr,nxheap

次の sxadm コマンドも拡張をシステム全体で有効にしますが、各プロパティーを明示的に指定しています。

# sxadm enable -c model=all aslr
# sxadm enable -c model=all -c log=enable nxstack

また、sxadm のサブコマンド exec を使用すると、セキュリティー拡張をプロセスに対して有効または無効にすることができます。このサブコマンドは、セキュリティー拡張のステータスにのみ影響します。拡張のほかのプロパティーは、すべてシステムプロパティーから継承されます。次の sxadm コマンドにより、foobar プロセスは必ず拡張が無効になった状態で実行されます。

$ sxadm exec -s aslr=disable -s nxheap=disable foobar

セキュリティー拡張はまた、smf(7) を使用してシステム全体で構成することもできます。セキュリティー拡張サービスは system/security/security-extensions であり、プロパティーは '[extension]/[property]' の形式で指定されます。ここで、extension はセキュリティー拡張の名前であり、property はアクセスするプロパティーの名前です。

拡張ステータスは、'[extension]/config' プロパティーを使用して構成できます。これは、次の値を持つことがあります。

enabled:   the extension is enabled at boot
disabled:  the extension is disabled at boot
default:   the extension has the Oracle provided default setting
      

Solaris での拡張はすべて、configuration=default で出荷されます。

実行可能ファイルにタグ付けされる拡張

個々の実行可能ファイルには、次の ld(1) オプションで構築する際に、セキュリティー拡張の要件をタグ付けできます。

–z sx=aslr[=mode]

ASLR のタグ付けを制御します。

–z sx=nxheap[=mode]

実行不能ヒープのタグ付けを制御します。

–z sx=nxstack[=mode]

実行不能スタックのタグ付けを制御します。

–z sx=adiheap[=mode]

ADI ヒープアロケータの使用タグ付けを制御します。

–z sx=adistack[=mode]

ADI スタック保護のタグ付けを制御します。

mode には enabled または disabled を指定できます。mode が指定されていない場合、デフォルトは enabled です。

タグ付けされた実行可能ファイル内に定義されているセキュリティー拡張は、システム全体のセキュリティー設定と次のように相互に作用します。

  • 特定の拡張を無効にするタグ付けされた実行可能ファイル内のセキュリティー設定は、システムのセキュリティー設定にかかわらず尊重されます。

  • 特定の拡張を有効にするタグ付けされた実行可能ファイル内のセキュリティー設定は、システムのセキュリティー設定が tagged-files である場合にのみ尊重されます。

  • sxadm exec で指定されたセキュリティー設定は、タグ付けされた実行可能ファイルの設定をオーバーライドします。

サブコマンド

sxadm コマンドには次のサブコマンドがあります。

sxadm enable [–c property=value[,property=value,...]] extension[,extension,...]

現在のゾーンに対して指定したセキュリティー拡張を有効にします。–c オプションにより sxadm で特定の拡張のプロパティー値を渡すことができます。

拡張が構成可能でない場合、このコマンドは失敗します。変更にリブートが必要な場合、拡張ステータスは変更されず、この拡張は FLAGS 出力でリブート時の保留中の変更としてマークされます。

sxadm exec [–i] [–s extension=value],... command

セキュリティー拡張の特定の構成で、指定した command を実行します。コマンド行に明示的に構成されていない各セキュリティー拡張に対しては、システム構成が使われます。command によって生成された子プロセスは、コマンド行で指定されたセキュリティー拡張の構成を継承しません。継承は –i オプションを使用して有効にできます。setuid と特権バイナリはどの構成も継承しません。複数の –s オプションを使用して、コマンド行から複数の構成を表すことができます。同じ拡張が複数回構成されている場合、最後の構成が優先されます。次の例で、foobarASLR が有効になった状態で実行されます。

$ sxadm exec -s aslr=disable -s aslr=enable foobar

sxadm exec サブコマンドは、デバッガがデバッガによって直接起動された単一のプロセスに適用される一般的な例に対応するように設計されています。もっと複雑なシナリオでは十分でないことがあります。その場合は、sxadm を使用して、システムまたはゾーンレベルのセキュリティー拡張のデフォルトを変更するか、デバッグを容易にするために、ld(1) を使用して、オブジェクト単位でのタグ付けを適用する必要がある可能性があります。

この機能が有用になるのは主に、ランダム化されたシークレットに基づく拡張 (ASLR など) がアクティブになっているときです。このような場合、メモリーアドレスの変更によってデバッグシナリオが複雑になる可能性があるためです。この機能は、セキュリティー拡張の構成が異なっているアプリケーションを明示的にテストする場合にも役立ちます。

sxadm delcust [extension,...]

拡張をデフォルト構成に復元します。このオプションは実質的にすべてのカスタマイズ内容を削除します。

sxadm disable extension[,extension,...]

現在のゾーンに対して指定したセキュリティー拡張を無効にします。

sxadm help [subcommand]

sxadm に関する使用法の情報または各サブコマンドの詳細情報を表示します。

sxadm status [–p –o field[,...]] [extension]

現在のゾーンのすべてのセキュリティー拡張のステータスに関する情報を報告します。–p オプションを指定した場合、出力は簡単に解析可能な形式で表示されます。コマンド行にextensionを指定すると、特定の拡張にフィルタします。

マシン解析可能な出力はコロン区切りのフィールドのリストです。

extension:status[.model]:configuration[.model]:flag[[.flag]...]

各表記の意味は次のとおりです。

extension

拡張の名前

status

拡張の現在のステータス (有効または無効)

model

セキュリティー拡張に対して現在有効になっているモデル (alldefaulttagged-binaries)

configuration

拡張の保存されている構成 (有効、無効、またはシステムデフォルト)

flag

拡張を記述したフラグ。各フラグは、フラグのフィールド内で「.」で区切られます。

拡張の FLAGS は次のとおりです。

u: userland security extension
k: kernel security extension
c: the extension is configurable
r: configuration changes require a reboot
p: the extension has pending configuration changes which will be
   activated upon reboot

文字のコロン (:)、NULL 記号 (\0)、および改行 (\n) は、どのコンポーネントにも使用できません。

sxadm get [–p –o field[,...]] property[,...] [extension]

セキュリティー拡張のプロパティーの値を表示します。すべてのプロパティーを表示するには、property をトークン「all」として定義できます。拡張が指定されている場合は、指定された拡張のプロパティーの値だけを表示します。プロパティーごとに、次の列が表示されます。

extension: the extension the property refers to
name: the name of the property
value: the value of the property

デフォルトでは、すべての列が表示されます。特定の列またはすべての列を指定するには、–o オプションを使用します。–p オプションを指定した場合、出力は簡単に解析可能な形式で表示されます。そのような形式は、フィールドをコロンで区切ったリストです。

extension:name:value

文字のコロン (:)、NULL 記号 (\0)、および改行 (\n) は、どのコンポーネントにも使用できません。

sxadm set property=value[,property=value,...] extension

指定された拡張のプロパティーに値を割り当てます。

使用例 1 セキュリティー拡張の現在の構成を表示する
$ sxadm status -p -o extension,status
aslr:enabled.tagged-files:u.c
nxstack:enabled.all):u.c
[...]
$

$ sxadm status
EXTENSION        STATUS                   FLAGS
aslr             enabled (tagged-files)   u-c---
nxstack          enabled (all)            u-c---
[...]
$
使用例 2 set/get を使用してセキュリティー拡張のプロパティーを設定/取得する
$ sxadm get model aslr
EXTENSION       PROPERTY          VALUE
aslr            model             default

# sxadm set log=enable nxheap
# sxadm get log nxheap
EXTENSION       PROPERTY         VALUE
nxheap          log              default
使用例 3 デバッグセッションの実行

次のコマンドシーケンスは、ASLR を無効にして実行されているデバッグセッションを示しています。

$ sxadm exec -i -s aslr=disable /bin/bash

# Because all processes (except privileged ones) inherit the
# (disabled) ASLR configuration, commands such as mdb and truss
# have repeatable results.

$ truss -t mmap /bin/true 
mmap(0x00000000, 32, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE5B0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE5A0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE590000
[...]
$ truss -t mmap /bin/true
mmap(0x00000000, 32, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE5B0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE5A0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE590000
[...]
$ truss -t mmap /bin/true
mmap(0x00000000, 32, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE5B0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE5A0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE,
    MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFE590000
[...]

終了ステータス

0

コマンドが正常に完了しました。

1

エラーが発生したため、コマンドが終了しました。

属性

属性についての詳細は、マニュアルページの attributes(7) を参照してください。

属性タイプ
属性値
使用条件
system/core-os
インタフェースの安定性
確実

関連項目

ld(1)exec(2)adi(3C)attributes(7)