Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
psc — eBPFのひねりとコンテナコンテキストを備えたpsユーティリティ | Kitploit
ツール/GitHubGitHub/loresuso/psc
防御ツールコンテナセキュリティネットワークマッピングフォレンジック情報収集インシデントレスポンス
GitHubloresuso/psc

psc

eBPFのひねりとコンテナコンテキストを備えたpsユーティリティ

リポジトリを見る
29787ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

psc

psc (ps container) は、eBPF イテレータと Google CEL を使用して、システム状態を正確かつ完全なコンテナコンテキストで問い合わせる高速プロセススキャナーです。

なぜ psc なのか?

eBPF イテレータによる高速カーネルレベルアクセス

psc は eBPF イテレータを使用して、カーネルデータ構造から直接プロセスおよびファイル記述子情報を読み取ります。このアプローチには以下の利点があります:

  • 高速:eBPF イテレータは、従来のツールがシステムコールの実行にほとんどの時間を費やす proc ファイルシステムと比較して非常に効率的です
  • 完全:/proc では従来公開されていないカーネル情報にアクセスできます。また、高度な用途のために task_struct の特定フィールドにオンデマンドでアクセスする方法も追加予定ですが、これはまだアイデア段階です
  • 改ざん耐性:/proc ファイルシステムを完全にバイパスするため、ユーザーランドのルートキットや LD_PRELOAD トリックによって可視性が損なわれることはありません

CEL による読みやすいクエリ

ps、lsof、ss などの従来の Linux ツールは強力ですが柔軟性に欠けます。固定形式で出力するため、grep、awk、sed を多用したパイプライン処理が必要です:

root@kitploit:~
# Traditional: Find nginx processes owned by root
ps aux | grep nginx | grep root | grep -v grep

# psc: Express exactly what you mean
psc 'process.name == "nginx" && process.user == "root"'
root@kitploit:~
# Traditional: Find processes with established connections on port 443
ss -tnp | grep ESTAB | grep :443 | awk '{print $6}' | cut -d'"' -f2

# psc: One clear expression
psc 'socket.state == established && socket.dstPort == 443'

psc は Common Expression Language (CEL) を使用してプロセスをフィルタリングします。CEL 式はほぼ自然言語のように読めるため、スクリプトが自己文書化され、保守しやすくなります。grep | awk | sed | xargs の複雑なパイプラインを解析する必要はもうありません。

-o フラグを使用すると、必要なフィールドのみを出力できるため、後処理が完全に不要になります:

root@kitploit:~
psc 'socket.state == listen' -o process.name,socket.srcPort

出力プリセットも用意されており、一般的な情報をすばやく表示できます:

root@kitploit:~
psc 'socket.type == tcp && socket.dstPort == 443' -o sockets 

ネイティブコンテナコンテキスト

従来のツールにはコンテナの概念がありません。コンテナ情報を取得するには、cgroup パスを解析し、コンテナランタイムに問い合わせ、PID を手動で関連付ける必要があります:

root@kitploit:~
# Traditional: Find containerized processes (fragile, incomplete)
ps aux | xargs -I{} sh -c 'cat /proc/{}/cgroup 2>/dev/null | grep -q docker && echo {}'

# psc: Native container support
psc 'container.runtime == docker'

psc は、Docker、containerd、CRI-O、Podman のコンテナコンテキスト(ID、名前、イメージ、ランタイム、ラベル)を自動的に抽出します。ホストから直接、任意のコンテナのプロセス、ファイル、ネットワーク接続をデバッグできます:

root@kitploit:~
# Show all processes in a specific container
psc 'container.name == "my-app"' --tree

# Find containers running as root
psc 'container.runtime == docker && process.user == "root"'

# List containers with their images
psc 'container.id != ""' -o process.pid,process.name,container.name,container.image

ビルド

要件

  • Linux カーネル 5.8 以降(eBPF イテレータはこのバージョンで導入されました)
  • Go 1.25 以降
  • Clang および LLVM
  • libbpf 開発用ヘッダー
  • Linux カーネルヘッダー
  • bpftool(vmlinux.h の生成用)

依存関係のインストール

Debian/Ubuntu の場合:

root@kitploit:~
sudo apt-get install clang llvm libbpf-dev linux-headers-$(uname -r) linux-tools-$(uname -r)

Fedora/RHEL の場合:

root@kitploit:~
sudo dnf install clang llvm libbpf-devel kernel-devel bpftool

ビルド

root@kitploit:~
# Generate vmlinux.h (required once per kernel version)
make vmlinux

# Build the binary
make build

または手動で:

root@kitploit:~
bpftool btf dump file /sys/kernel/btf/vmlinux format c > bpf/vmlinux.h
go generate ./...
go build -o psc

インストール

root@kitploit:~
sudo make install

使い方

psc は eBPF プログラムをロードするために root 権限 が必要です。

基本的な使い方

root@kitploit:~
# List all processes
sudo psc

# List all processes as a tree
sudo psc --tree

CEL 式によるフィルタリング

最初の引数として CEL 式を渡すことでプロセスをフィルタリングします:

root@kitploit:~
# Filter by process name
psc 'process.name == "nginx"'

# Filter by user
psc 'process.user == "root"'

# Filter by command line content
psc 'process.cmdline.contains("--config")'

# Filter by PID range
psc 'process.pid > 1000 && process.pid < 2000'

# Combine conditions
psc 'process.name == "bash" || process.name == "zsh"'

コンテナフィルタリング

root@kitploit:~
# Show only containerized processes
psc 'container.id != ""'

# Filter by container runtime (constants: docker, containerd, crio, podman)
psc 'container.runtime == docker'

# Filter by container name
psc 'container.name == "nginx"'

# Filter by container image
psc 'container.image.contains("nginx:latest")'

# Show as tree to see container process hierarchy
psc 'container.runtime == docker' --tree

ソケットおよびファイル記述子フィルタリング

プロセスが存在する理由を理解するには、そのプロセスが開いているファイル記述子やネットワーク接続を調べる必要があることがよくあります:

root@kitploit:~
# Find processes with listening TCP sockets
psc 'socket.type == tcp && socket.state == listen'

# Find processes with established connections
psc 'socket.state == established'

# Find processes connected to a specific port
psc 'socket.dstPort == 443'

# Find processes using Unix sockets
psc 'socket.family == unix'

# Find processes with files open in /etc
psc 'file.path.startsWith("/etc")'

利用可能なフィールド

プロセスフィールド (process.X):

  • name - プロセス名 (string)
  • pid - プロセス ID (int)
  • ppid - 親プロセス ID (int)
  • tid - スレッド ID (int)
  • euid - 実効ユーザー ID (int)
  • ruid - 実ユーザー ID (int)
  • suid - 保存 set-user-ID (int)
  • user - ユーザー名 (string)
  • cmdline - 完全なコマンドライン (string)
  • state - プロセス状態 (uint)

ケーパビリティフィールド (process.capabilities.X):

  • effective - 有効ケーパビリティビットマスク (uint)
  • permitted - 許可ケーパビリティビットマスク (uint)
  • inheritable - 継承可能ケーパビリティビットマスク (uint)

名前空間フィールド (process.namespaces.X):

  • net - ネットワーク名前空間 inode (int)
  • pid - PID 名前空間 inode (int)
  • mnt - マウント名前空間 inode (int)
  • uts - UTS 名前空間 inode (int)
  • ipc - IPC 名前空間 inode (int)
  • cgroup - Cgroup 名前空間 inode (int)

コンテナフィールド (container.X):

  • id - コンテナ ID (string)
  • name - コンテナ名 (string)
  • image - コンテナイメージ (string)
  • runtime - コンテナランタイム (string)
  • labels - コンテナラベル (map)

ファイル/ソケットフィールド (file.X または socket.X):

  • path - ファイルパス (string)
  • fd - ファイル記述子番号 (int)
  • srcPort - 送信元ポート (int)
  • dstPort - 宛先ポート (int)
  • type - ソケットタイプ (tcp, udp)
  • state - ソケット状態 (フィルタリングには listen、established などの定数を使用)
  • family - アドレスファミリー (unix, inet, inet6)
  • unixPath - Unix ソケットパス (string)
  • fdType - FD タイプ (file_type, socket_type)

利用可能な定数

式内で引用符なしで使用します:

  • ランタイム: docker、containerd、crio、podman
  • ソケットタイプ: tcp、udp
  • アドレスファミリー: unix、inet、inet6
  • ソケット状態 (フィルタリング用): established、listen、syn_sent、syn_recv、fin_wait1、fin_wait2、、、、、

注: 出力では ss スタイルの状態名(ESTAB、LISTEN、SYN-SENT など)を使用します。UDP ソケットの場合は、コネクションレスであるため、UNCONN(未接続)または ESTAB(接続済み)のみが表示されます。

文字列関数

CEL は文字列操作関数を提供します:

  • .contains("substr") - 文字列に部分文字列が含まれているか確認
  • .startsWith("prefix") - 文字列がプレフィックスで始まっているか確認
  • .endsWith("suffix") - 文字列がサフィックスで終わっているか確認

オプション

  • --tree、-t - プロセスをツリー表示
  • --no-color - 色付き出力を無効化
  • -o、--output - カスタム出力カラム(カンマ区切りのフィールド名またはプリセット)

サブコマンド

  • psc fields - 利用可能なすべての CEL フィールド、定数、出力プリセットを表示
  • psc version - バージョン情報を表示

-o によるカスタム出力

-o フラグを使用すると、表示するフィールドを正確に指定できます。一般的なユースケースには プリセット を使用するか、個別のフィールドを指定できます。

プリセット:

  • sockets - プロセス情報 + 完全なソケット詳細(ファミリー、タイプ、状態、アドレス、ポート)
  • files - プロセス情報 + ファイル記述子詳細(fd、タイプ、パス)
  • containers - プロセス情報 + コンテナ詳細(名前、イメージ、ランタイム)
  • network - コンパクトなネットワークビュー(pid、名前、タイプ、状態、ポート)
root@kitploit:~
# Use a preset
psc 'socket.state == listen' -o sockets
psc 'container.id != ""' -o containers

# Or specify individual fields
psc -o process.pid,process.name,process.user
psc 'socket.state == listen' -o process.pid,process.name,socket.srcPort,socket.state

出力にファイル/ソケットフィールドが含まれ、フィルタがプロセスごとに複数のファイルに一致する場合、一致ごとに個別の行が表示されます:

root@kitploit:~
$ psc 'socket.state == listen' -o network

PID      NAME      TYPE   STATE    SRCPORT   DSTPORT
1234     nginx     tcp    LISTEN   80        0
1234     nginx     tcp    LISTEN   443       0
5678     sshd      tcp    LISTEN   22        0

例

すべての Web サーバーを検索:

root@kitploit:~
psc 'process.name == "nginx" || process.name == "apache2" || process.name == "httpd"'

特権ポートでリッスンしているプロセスを検索:

root@kitploit:~
psc 'socket.state == listen && socket.srcPort < 1024'

異なるネットワーク名前空間内のプロセスを検索(コンテナ/Pod の検査に便利):

root@kitploit:~
psc 'process.namespaces.net != 4026531840' -o process.pid,process.name,process.namespaces.net

特権プロセスのケーパビリティを表示:

root@kitploit:~
psc 'process.euid == 0' -o process.pid,process.name,process.capabilities.effective,process.capabilities.permitted

SUID バイナリによって昇格された特権を持つプロセスを検索(実 UID と実効 UID が異なる):

root@kitploit:~
psc 'process.ruid != process.euid'

外部サービスへの接続があるプロセスを検索:

root@kitploit:~
psc 'socket.state == established && socket.dstPort == 443'

カスタムカラムでネットワーク接続を表示:

root@kitploit:~
psc 'socket.state == established' -o process.pid,process.name,socket.srcPort,socket.dstPort,socket.dstAddr

ライセンス

MIT

ツールをダウンロード
time_wait
close
close_wait
last_ack
closing
  • FD タイプ: file_type、socket_type