NETCAP(8) ابزارهای مدیریت سیستم NETCAP(8)

netcap - برنامهای برای بررسی وضعیت قابلیتهای شبکه فرآیندها

netcap [--advanced [--interface IFACE ] [--list-interfaces] [--json] [--no-color]]

برنامه netcap گزارشی از قابلیت‌های (capabilities) فرآیندها چاپ می‌کند. به‌طور پیش‌فرض، در حالت فیلترشده سنتی خود اجرا می‌شود: اگر برنامه‌ای از سوکت‌های خانواده tcp، udp، raw یا packet استفاده کند و همچنین دارای هرگونه قابلیتی باشد، در گزارش لحاظ خواهد شد. اگر فرآیند دارای قابلیت‌های جزئی باشد، بیشتر بررسی می‌شود تا مشخص گردد آیا مجموعه محدودکننده باز (open-ended bounding set) دارد یا خیر. در صورتی که این مورد درست باشد، علامت «+» افزوده می‌شود. اگر فرآیند دارای قابلیت‌های محیطی (ambient capabilities) باشد، علامت «@» اضافه خواهد شد. سوکت‌های بلوتوث (Bluetooth) در این حالت فیلترشده سنتی شناسایی نمی‌شوند؛ در صورتی که به شناسایی شنوندگان بلوتوث نیاز است، از --advanced استفاده کنید.

با گزینه --advanced، برنامه netcap به حالت سیاهه اتصالات/شنوندگان (bind/listener inventory) برای فضای نام شبکه فعلی تغییر وضعیت می‌دهد. در این حالت، اتصالات/شنوندگان قابل‌دسترس صرف‌نظر از اینکه فرآیند مالک دارای قابلیت است یا خیر گزارش می‌شوند، از جمله شنوندگان بلوتوث که در حالت کلاسیک قابل مشاهده نیستند.

برخی دایرکتوری‌ها در سیستم فایل /proc فقط توسط کاربر ریشه (root) قابل خواندن هستند. برنامه تلاش خواهد کرد به آنچه می‌تواند دسترسی پیدا کرده و آن را گزارش دهد. خروجی کامل معمولاً نیازمند کاربر ریشه است، یا ترکیبی از CAP_DAC_READ_SEARCH (برای خواندن /proc/<pid>/fd سایر فرآیندها) و CAP_NET_ADMIN (برای پرس‌وجوهای NETLINK_SOCK_DIAG که پروتکل‌های SCTP، DCCP و در صورت ساخت با پشتیبانی از VSOCK، پروتکل VSOCK را پوشش می‌دهند). بدون این مجوزها، گزارش ناقص خواهد بود؛ پروتکل‌های مشتق‌شده از sock_diag که موجود نیستند، بدون هشدار صریح حذف می‌شوند.

فعال‌سازی نمای وضعیت امنیتی/درختی (posture/tree). این حالت، اتصالات (binds) قابل‌دسترس در فضای نام شبکه فعلی را فهرست‌بندی کرده و قابلیت‌ها، سازوکارهای دفاعی و پرچم‌های هر فرآیند را نشان می‌دهد.
همراه با --advanced، گزارش را به رابط نام‌برده محدود می‌کند. قالب خروجی و شکست خطوط تغییر نمی‌کند؛ تنها ردیف‌های مربوط به آن رابط نگه‌داشته می‌شوند. این گزینه همچنین خروجی --list-interfaces را به رابط مشخص‌شده محدود می‌کند.
همراه با --advanced، به جای درخت مواجهه، نام رابط‌های فضای نام شبکه فعلی را فهرست می‌کند.
همراه با --advanced، به جای نمای درختی، خروجی JSON با قابلیت خواندن توسط ماشین تولید می‌کند. هنگامی که با --list-interfaces ترکیب شود، به جای متن، سیاهه رابط‌ها را در قالب JSON با قابلیت خواندن توسط ماشین تولید می‌کند.
غیرفعال کردن خروجی رنگی. به‌طور پیش‌فرض، هنگامی که خروجی استاندارد (stdout) یک ترمینال باشد، کلیدواژه‌ها بر اساس میزان اهمیت/شدت رنگی می‌شوند تا مشکلات، هشدارها و وضعیت مثبت مقاوم‌سازی برجسته شوند.

حالت پیشرفته، یک سیاهه از سطح حمله و وضعیت امنیتی (posture) برای فضای نام شبکه فعلی است. این حالت برای مدیران سیستمی در نظر گرفته شده است که به یک نمای ساختاریافته از مالکیت اتصالات (bind) و وضعیت مقاوم‌سازی (hardening) فرآیندها نیاز دارند.

با استفاده از --advanced --list-interfaces، تصویر لحظه‌ای رابط‌های حالت پیشرفته مستقیماً بدون شمارش شنوندگان نمایش داده می‌شود. هدف از این کار، ارائه یک گام ساده برای شمارش رابط‌ها پیش از تحلیل‌های بعدی به تفکیک رابط است. با استفاده از --advanced --interface IFACE، همان سازوکار سیاهه و رندرهای درختی/JSON به کار گرفته می‌شوند، اما تنها نقاط پایانی (endpoints) نگاشت‌شده روی آن رابط حفظ می‌گردند.

چیدمان درختی به این صورت است:

Planes -> interface -> protocol -> bind -> port -> process -> caps/defenses/flags

برای VSOCK، سلسله‌مراتب رابط/آدرس نادیده گرفته شده و به این شکل نمایش داده می‌شود:

Planes -> endpoint -> process -> caps/defenses/flags

برای BLUETOOTH، رابط همان آداپتور HCI است (برای نمونه hci0). گره‌های اتصال بلوتوث، آدرس کنترل‌کننده محلی یا علامت * برای اتصالات عام (wildcard) هستند.

سطوح ارتباطی (Planes) به صورت INET (external)، INET (loopback)، BLUETOOTH، VSOCK و LINK-LAYER گروه‌بندی می‌شوند. این نام‌ها دقیقاً با خروجی درختی مطابقت دارند.

درخت کنسول یک زنجیره مواجهه علّی است: پروتکل، سپس آدرس اتصال (bind)، سپس پورت، و سپس فرآیند مالک. اتصالات عام (wildcard) به صورت * چاپ می‌شوند. در نمای درختی، یک شنونده منفرد 0.0.0.0 یا :: روی هر رابط غیر loopback در فضای نام فعلی بسط داده می‌شود. بنابراین یک دیمن (daemon) یکسان ممکن است زیر چندین رابط ظاهر شود که بیانگر دسترس‌پذیری از طریق اتصالات عام است. برخی از نقاط پایانی ممکن است در صورت اتصال به آدرس‌های چندپخشی (multicast) که به یک رابط واحد نگاشت نمی‌شوند، زیر رابط multicast/group ظاهر گردند؛ این موارد نمایانگر سوکت‌های پیوسته به گروه هستند و نه شنوندگان نقطه به نقطه (point-to-point).

زیر هر پروتکل، گره‌های bind آدرس‌های اتصال سوکت (مواجهه) بوده و گره‌های port فرزندان اتصالات هستند. هر ورودی فرآیند ممکن است شامل فیلد unit باشد که نام سرویس یا scope در systemd را نمایش می‌دهد و از سلسله‌مراتب cgroup فرآیند استخراج می‌شود؛ اگر فرآیند توسط systemd مدیریت نشود، این فیلد حذف می‌شود. همچنین هر خط فرآیند شامل یک فیلد اختیاری exe است که مسیر کامل فایل اجرایی خوانده‌شده از /proc/<pid>/exe را نشان می‌دهد؛ این فیلد برای ریسه‌های هسته (kernel threads) یا زمانی که مسیر غیرقابل خواندن باشد حذف می‌شود. فیلد Name: در هسته که با عنوان comm نمایش داده می‌شود تا ۱۵ نویسه کوتاه می‌شود، بنابراین فیلد exe مسیر کامل باینری را ارائه می‌دهد.

گزینش سوکت‌ها وابسته به پروتکل است:

•
TCP: فقط سوکت‌های LISTEN.
•
UDP/UDPLITE: سوکت‌های متصل‌شده (bound).
•
RFCOMM: تمام سوکت‌های RFCOMM تحت مالکیت (وضعیت و کانال توسط رابط proc هسته ارائه نمی‌شوند).
•
HCI: تمام سوکت‌های خام مدیریتی متصل‌شده؛ معناشناسی آن‌ها با شنوندگان پورت تفاوت دارد و مشابه سوکت‌های بسته‌ای (packet sockets) است.
•
SCTP/DCCP: فقط سوکت‌های شنونده؛ جریان‌های برقرارشده نمایش داده نمی‌شوند. این پروتکل‌ها از طریق NETLINK_SOCK_DIAG شناسایی می‌شوند که نیازمند CAP_NET_ADMIN است؛ بدون آن قابلیت، شنوندگان SCTP و DCCP بدون هشدار صریح در گزارش غایب خواهند بود.
•
VSOCK: در صورت کامپایل با linux/vm_sockets.h، سوکت‌های جریانی LISTEN، به‌علاوه سوکت‌های متصل‌شده datagram/seqpacket.
•
RAW/PACKET: به صورت اتصالات (binds) نشان داده می‌شوند؛ معناشناسی آن‌ها با شنوندگان پورت تفاوت دارد.

بخش دفاعیات (defenses) به بهترین شکل ممکن (best-effort) عمل می‌کند: حالت‌های no_new_privs و seccomp در صورت وجود از /proc/<pid>/status خوانده می‌شوند، و برچسب LSM در صورت در دسترس بودن از /proc/<pid>/attr/current خوانده می‌شود. وضعیت runs_as_nonroot همواره گزارش می‌گردد.

پرچم‌ها (Flags) شرایط قابل توجه را مشخص می‌کنند:

•
wildcard-bind: اتصال به یک آدرس عام (برای نمونه 0.0.0.0 یا ::) برقرار است.
•
hypervisor-plane: اتصال در سطح ارتباطی VSOCK قرار دارد.
•
proximity-plane: اتصال برای هر دستگاه بلوتوث در برد رادیویی قابل دسترس است.
•
ssh-on-vsock-port-22: اتصال VSOCK از پورت ۲۲ استفاده می‌کند.
•
privileged-caps: فرآیند دارای قابلیت‌هایی است که برای بررسی سطح حمله، ممتاز در نظر گرفته می‌شوند (CAP_SYS_ADMIN، CAP_SYS_PTRACE، CAP_DAC_READ_SEARCH، CAP_NET_ADMIN و CAP_NET_RAW).

فیلد caps ممکن است شامل توضیحات درون براکت باشد: [ambient-present] نشان می‌دهد که قابلیت‌های محیطی تنظیم شده‌اند، و [open-ended-bounding] نشان می‌دهد که مجموعه محدودکننده خالی نیست (فرآیند یا فرزندان آن می‌توانند به‌طور بالقوه قابلیت‌های بیشتری به دست آورند).

هنگامی که از --advanced --json استفاده می‌شود، شیء سطح بالا (top-level) شامل موارد زیر است:

•
schema_version (عدد صحیح).
•
planes (آرایه).

هر شیء سطح ارتباطی (plane) شامل name، فیلد اختیاری scope (external یا loopback)، و یکی از موارد زیر است:

•
ifaces (برای سطوح INET/LINK-LAYER/BLUETOOTH)، یا
•
endpoints (برای سطح VSOCK).

زیر ifaces: هر رابط دارای name و addrs (آرایه) است. هر شیء addr دارای addr و endpoints (آرایه) است.

برای سطوح INET، LINK-LAYER و BLUETOOTH، هر شیء endpoint دارای label، proto، bind، port و processes (آرایه) است. برای سطوح BLUETOOTH، نام‌های رابط همان نام‌های آداپتور HCI هستند (برای نمونه hci0)؛ مقدار port برای سوکت‌های HCI و برای سوکت‌های RFCOMM که کانال آن‌ها توسط procfs ارائه نشده است، برابر ۰ خواهد بود. برای سطوح VSOCK، اشیاء endpoint از label، vsock_type (رشته نوع سوکت: stream/dgram/seqpacket)، cid (شناسه منبع یا رشته ANY)، port و processes استفاده می‌کنند؛ آن‌ها شامل proto یا bind نیستند. هنگامی که برنامه بدون linux/vm_sockets.h ساخته شود، سطح VSOCK و پرچم‌های VSOCK حذف می‌شوند.

هر شیء فرآیند (process) دارای comm، فیلد اختیاری exe، pid، uid، فیلد اختیاری unit، caps، ambient_present (بولی)، open_ended_bounding (بولی)، شیء defenses و آرایه flags است.

فیلدهای ambient_present و open_ended_bounding معادل‌های ساختاریافته توضیحات [ambient-present] و [open-ended-bounding] هستند که ممکن است در رشته متنی caps ظاهر شوند؛ هر دو فیلد همیشه در خروجی JSON حضور دارند.

فیلدهای زیر endpoints/processes/defenses در صورت در دسترس نبودن ممکن است حذف شوند. هنگامی که دفاعیات فرآیند موجود باشند، شامل runs_as_nonroot مشتق‌شده از UID واقعی (اولین فیلد Uid: در /proc/<pid>/status) خواهند بود: در صورتی که UID واقعی != 0 باشد مقدار yes، و در صورتی که UID واقعی == 0 باشد مقدار no. فرآیندی که با ریشه (root) شروع به کار کرده و بعداً تنها UID موثر را از طریق setuid تغییر داده باشد، همچنان no را گزارش می‌دهد.

اگر یک سطح ارتباطی فاقد اتصالات شناسایی‌شده باشد، با یک لیست خالی ظاهر می‌شود. اگر مصرف‌کننده سطح ارتباطی خاصی را دریافت نکرد، آن را به عنوان عدم کشف یا حذف‌شده توسط تولیدکننده در نظر بگیرید.

هنگامی که از --advanced --list-interfaces --json استفاده می‌شود، شیء سطح بالا شامل schema_version (عدد صحیح) و interfaces (آرایه‌ای از رشته‌های نام رابط‌ها) خواهد بود.

ابزار netcap فرآیندهایی را گزارش می‌کند که هم رو به شبکه بوده و هم با قابلیت‌ها (capabilities) اجرا می‌شوند. مجموعه قابلیت‌های نشان‌داده‌شده، مجموعه مجاز (permitted set) است. علامت «+» به این معنی است که فرآیند دارای یک مجموعه محدودکننده باز (open-ended bounding set) است، و علامت «@» بیانگر این است که فرآیند دارای قابلیت‌های محیطی (ambient capabilities) است.

خروجی درختی رنگی با هدف اولویت‌بندی سریع اقدامات اصلاحی در نظر گرفته شده است: رنگ نارنجی مشکلات نیازمند رفع را برجسته می‌کند، رنگ زرد شرایط هشداردهنده جهت بررسی را نشان می‌دهد، رنگ سبز وضعیت مقاوم‌سازی مطلوب را مشخص می‌سازد، و خروجی بدون رنگ، بستر خنثی است.

خط caps قابلیت‌های مجاز را نشان می‌دهد. قابلیت‌های سطح نارنجی بیانگر اختیارات حساسی هستند که به ندرت برای دیمن‌های رو به شبکه ضروری هستند: sys_ptrace، sys_module، sys_rawio، setuid، setgid، setpcap و audit_control. قابلیت‌های سطح زرد متداول هستند اما همچنان به طور چشمگیری تأثیر حملات را افزایش می‌دهند: sys_admin، dac_override، dac_read_search، net_admin، net_raw، chown، fowner، mknod و sys_chroot. عبارت caps: (full) یعنی تمام قابلیت‌ها وجود دارند (عملاً اختیارات کامل ریشه). عبارت caps: (none) ایده‌آل است.

قابلیت‌های محیطی در هنگام execve توسط فرآیندهای فرزند به ارث برده می‌شوند (مگر اینکه توسط no_new_privs محدود شده باشند)، بنابراین حضور آن‌ها روی یک دیمن شبکه معمولاً یک مشکل امنیتی است. خط ambient: قابلیت‌های محیطی فعال را فهرست می‌کند.

عبارت [open-ended-bounding] بدین معناست که فرآیند سقف مجموعه محدودکننده خود را کاهش نداده است. این مورد به خودی خود یک امتیاز فعال نیست، اما مسیرهای کسب امتیاز در آینده را باز می‌گذارد (برای نمونه از طریق قابلیت‌های فایل یا ارث‌بری محیطی). برای کاربران libcap-ng، این کار معمولاً با تغییر یک پرچم (CAPNG_SELECT_BOUNDS) در فراخوانی‌های موجود تنظیم قابلیت‌ها صورت می‌گیرد؛ در libcap، قابلیت‌های محدودکننده باید تک‌تک حذف شوند.

فیلدهای دفاعی وضعیت مقاومت در برابر اکسپلویت را خلاصه می‌کنند: no_new_privs: yes کسب امتیاز از طریق مسیرهای اجرایی setuid/file-capability را مسدود می‌کند و اغلب ارزشمندترین سوئیچ منفرد است. seccomp: filter فراخوانی‌های سیستمی موجود را محدود می‌کند (disabled به معنای عدم فیلتر فراخوانی‌های سیستمی است). runs_as_nonroot: yes نشان‌دهنده اجرا با کاربری غیر از ریشه (UID-0) است.

پرچم‌ها بستر دسترس‌پذیری و شنود را ارائه می‌دهند: wildcard-bind به این معناست که دیمن روی تمامی رابط‌ها گوش می‌دهد، hypervisor-plane نشان‌دهنده مواجهه با مرز میزبان/مهمان (VSOCK) است، proximity-plane مشخص می‌کند که اتصال برای دستگاه‌های بلوتوث درون برد رادیویی قابل دسترس است، و reuseport به این معناست که فرآیند دیگری با همان UID می‌تواند متصل شده و احتمالاً ترافیک را رهگیری کند.

گره‌های پروتکل raw/raw6 و packet نمایانگر سوکت‌هایی با قابلیت ساخت/شنود بسته‌های لایه IP یا لایه پیوند داده هستند که به طور چشمگیری توانایی حمله‌کننده را پس از نفوذ افزایش می‌دهند. گره‌های پروتکل بلوتوث نشان‌دهنده سطح حمله مبتنی بر مجاورت هستند. گره‌های hci دسترسی خام به مدیریت کنترل‌کننده را فراهم می‌کنند و به رنگ زرد نشان داده می‌شوند. سوکت‌های rfcomm توسط دستگاه‌های مجاور بدون دسترسی قبلی به میزبان قابل دسترس هستند و مگر در حالتی که آداپتور برای الزام به جفت‌سازی پیکربندی شده باشد، ممکن است بدون احراز هویت قابل دسترس باشند. تحلیل نشانی BD_ADDR آداپتور نیازمند دسترسی ioctl مربوط به HCI است؛ بدون آن، هویت آداپتور به صورت hci?/* نمایش داده می‌شود.

pscap(8), filecap(8), capabilities(7), netstat(8).

استیو گراب (Steve Grubb)

مارس ۲۰۲۶ Red Hat