| CECCOMP(1) | Ceccomp Manual | CECCOMP(1) |
نام (NAME)
ceccomp - ابزار آزمون و بازرسی ساختار باینریهای کامپایلشده
خلاصه دستور (SYNOPSIS)
usage: ceccomp <asm|disasm|emu|trace|probe|version|help> [FILE] [-q|--quiet]
[-f|--format FMT] [-a|--arch ARCH] [-p|--pid PID] [-s|--seize]
[-o|--output FILE] [-c|--color WHEN] ...
مفاهیم (CONCEPT)
هسته لینوکس از فیلترهای BPF برای محدودسازی قواعد فراخوانیهای سیستمی (syscall) استفاده میکند که از طریق فراخوانی سیستمی seccomp یا prctl اعمال میشوند. برای نمونه، در زیر یک فیلتر ساده به صورت قالب هگزادسیمال آورده شده است که فراخوانی سیستمی execve را مسدود میکند:
1: 20 00 00 00 00 00 00 00 $A = $syscall_nr 2: 15 00 00 01 3b 00 00 00 if ($A != execve) goto 4 3: 06 00 00 00 00 00 00 00 return KILL 4: 06 00 00 00 00 00 ff 7f return ALLOW
بخش ارائهشده به صورت هگزادسیمال، همان چیزی است که هسته دریافت کرده است و ceccomp آن را دریافت کرده و به متنی خوانا برای انسان دیساسمبل میکند؛ به عنوان نمونه lineno در سمت چپ و statement در سمت راست قرار دارد.
مهم (Important)
در ادامه،
از
TEXT بهطور
خلاصه برای
متن خوانا
برای انسان
BPF، و از RAW
بهطور
خلاصه برای
فرمت خام BPF
استفاده
میشود؛
لطفاً این
نکته را به
خاطر داشته
باشید.
توضیحات (DESCRIPTION)
ابزار ceccomp دارای ۵ عملکرد اصلی است و در اصل یک نسخه بازنویسیشده به زبان C از seccomp-tools میباشد. با این حال، برخی تغییرات ناسازگار بنیادین (breaking changes) وجود دارد که باید از آنها مطلع باشید و در بخش مربوط به هر زیردستور مشخص شدهاند.
asm - سرهمسازی (asm - ASSEMBLE)
ceccomp asm [-c WHEN] [-a ARCH] [-f FMT] [TEXT]
سرهمسازی (اسمبل کردن) TEXT به RAW. از این زیردستور برای جاسازی قواعد فیلتر دستنویس درون کدهای زبان C یا مشاهده کدهای اصلی یک فایل TEXT استفاده کنید.
WHEN
ARCH
نکته (Note)
از
نسخه ۴.۰ به
بعد، ترتیب
بایتها (Endianness)
مد نظر قرار
میگیرد.
اگر ترتیب
بایتهای
معماری هدف
(ARCH) با ترتیب
بایتهای
ماشین
متفاوت
باشد،
فیلترها
(بخشهای CODE و K)
قبل از
خروجی دادن
معکوس
خواهند شد.
FMT
TEXT
مهم (Important)
نحو اسمبل
کردن از
نسخه ۴.۰ به
بعد
تغییرات
زیادی
داشته است؛
لطفاً بخش
مرجع دستور
زبان در
ادامه را
بررسی
کنید!
لطفاً بخش «مرجع دستور زبان متنی (TEXT GRAMMAR REFERENCE)» را مطالعه کنید تا با نحوه نگارش دستی یک قاعده آشنا شوید. چند نمونه در بخش «مثالها (EXAMPLES)» نمایش داده خواهد شد.
| دستور (Command) | تفاوت (Difference) |
| seccomp-tools asm | از دستور زبان اختصاصی خود برای اسمبل کردن استفاده میکند که تا حدی شبیه اسکریپت است؛ میتواند متنهای نامعتبر TEXT را که توسط هسته رد میشوند اسمبل کند |
| ceccomp asm | میتوانید مستقیماً خروجی disasm را به asm بدهید، نیازی به یادگیری دستور زبان جدید نیست؛ ورودی پیشفرض را از stdin دریافت میکند |
disasm - واسازی (disasm - DISASSEMBLE)
ceccomp disasm [-c WHEN] [-a ARCH] [RAW]
واسازی (دیساسمبل کردن) RAW به TEXT. اگر نتوانستید از طریق trace به فیلتر دسترسی پیدا کنید و مجبور به استخراج دستی فیلتر شدید، از این زیردستور برای مشاهده عملکرد فیلتر استفاده کنید.
WHEN
ARCH
RAW
نکته (Note)
از
نسخه ۴.۰ به
بعد، ترتیب
بایتها (Endianness)
مد نظر قرار
میگیرد.
اگر ترتیب
بایتهای
معماری هدف
(ARCH) با ترتیب
بایتهای
ماشین
متفاوت
باشد،
فیلترها
(بخشهای CODE و K)
قبل از
رمزگشایی
معکوس
خواهند شد.
نکته (Note)
ابزار ceccomp تنها زمانی تلاش میکند شماره فراخوانی سیستمی را ذیل یک معماری حلوفصل کند که در همان خط، معماری قابل تشخیص باشد. در معماریهای بیگانه (مغایر با معماری تعیینشده)، نام معماری بیگانه به ابتدای نام فراخوانی سیستمی اضافه خواهد شد. ممکن است متوجه شوید در برخی موارد seccomp-tools قادر به حل نام است در حالی که ceccomp چنین نیست؛ این رفتار عمدی است زیرا معماری دقیقاً مشخص نشده است.
| دستور (Command) | تفاوت (Difference) |
| seccomp-tools disasm | در قالب اختصاصی خود دیساسمبل میکند؛ هرگز معتبر بودن فیلتر را بررسی نمیکند |
| ceccomp disasm | در قالب ceccomp دیساسمبل میکند و به طور پیشفرض ورودی را از stdin میگیرد؛ معماری را به طور دقیق بررسی میکند و همیشه نام معماری بیگانه را نمایش میدهد |
emu - شبیهسازی (emu - EMULATE)
ceccomp emu [-c WHEN] [-a ARCH] [-q] TEXT SYSCALL_NAME/SYSCALL_NR [ARGS[0] ARGS[1] ... ARGS[5] PC]
شبیهسازی آنچه اتفاق خواهد افتاد اگر فراخوانی syscall(SYSCALL_NR, ARGS[0], ARGS[1], ..., ARGS[5]) از مقدار PC طبق قواعد شرحدادهشده در TEXT صدا زده شود. از آن برای مشاهده نتیجه بدون نیاز به اجرای واقعی در برنامه یا مواقعی که نمیخواهید قاعده فیلتر را به صورت دستی بازرسی کنید استفاده نمایید. این زیردستور میتواند برای بررسی خودکار فیلتر به کار رود.
WHEN
SYSCALL_NAME/SYSCALL_NR
ARGS[0-5] and PC
ARCH
TEXT
-q, --quiet
| دستور (Command) | تفاوت (Difference) |
| seccomp-tools emu | یک فایل RAW را به عنوان ورودی میگیرد |
| ceccomp emu | یک فایل TEXT را به عنوان ورودی میگیرد و به طور پیشفرض از stdin میخواند؛ امکان تنظیم PC وجود دارد |
trace - ردگیری فیلتر در زمان اجرا (trace - TRACE FILTER IN RUNTIME)
ceccomp trace [-c WHEN] [-q] [-o FILE] PROGRAM [program-args]
[-c WHEN] [-q] -p PID [-s]
خط اول فیلترهایی را که PROGRAM در زمان اجرا با ردگیری آن بارگذاری میکند ضبط مینماید؛ خط دوم فیلترهای seccomp را از PID استخراج میکند یا PID را برای ضبط فیلترهای seccomp بعدی ردگیری مینماید؛ پس از واکشی فیلترها، آنها را در قالب TEXT چاپ میکند. شما فقط میتوانید یکی از دو ساختار فوق را انتخاب کنید. اگر اجرای برنامه سادهترین راه برای واکشی فیلترهای bpf است یا برنامهای با فیلترهای seccomp نصبشده منتظر ورودی است، از این حالت استفاده کنید.
WHEN
FILE
PROGRAM
PID
-s, --seize
-q, --quiet
نکته (Note)
برای
استخراج
فیلترها از
PID، مجوز CAP_SYS_ADMIN
(بدون سوییچ
-s) و
احتمالاً
CAP_SYS_PTRACE مورد
نیاز است؛
سادهترین
راه برای
کسب آنها
اجرای ceccomp با
sudo است.
نکته (Note)
از
نسخه ۳.۱ به
بعد،
قابلیت
ردگیری
چندین
فرآیند
معرفی شد و
هنگامی که
فرآیند تحت
ردگیری
انشعاب
مییابد (fork)،
تفکیک
میشود یا
خارج
میگردد،
یک پیام INFO
اضافی چاپ
میشود. با
اجرای
دستوری
مانند ceccomp trace -q PROG
2>/dev/null
میتوانید
از نمایش آن
صرفنظر
کنید.
نکته (Note)
از
نسخه ۴.۲ به
بعد،
زیردستور dump
به عنوان
نام مستعار
(alias) برای trace
اضافه شد تا
سازگاری با
seccomp-tools حفظ شود.
| دستور (Command) | تفاوت (Difference) |
| seccomp-tools dump | تنظیم قالب خروجی امکانپذیر است؛ هر فیلتر میتواند در فایل متفاوتی ذخیره شود؛ فرآیند PROGRAM را پس از LIMIT بار بارگذاری فیلتر متوقف (kill) میکند؛ دستور PROGRAM را درون sh -c کپسوله میکند |
| ceccomp trace یا ceccomp dump | همه فیلترها در یک فایل واحد خروجی داده میشوند؛ هرگز PROGRAM را kill نمیکند؛ برنامه PROGRAM مستقیماً راهاندازی میشود و نیازی به ./ نیست؛ هنگام fork کردن فرآیند پیام صریح چاپ میکند؛ قادر است برای ثبت پویای فیلتر seccomp به pid متصل شود |
probe - آزمون فوری فراخوانیهای سیستمی متداول (probe - TEST COMMON SYSCALLS INSTANTLY)
ceccomp probe [-c WHEN] [-o FILE] [-q] PROGRAM [program-args]
اجرای PROGRAM همراه با program-args برای ضبط نخستین (FIRST) فیلتر seccomp و سپس پایان دادن (kill) به همه فرزندان. از این زیردستور زمانی استفاده کنید که به یک بررسی سریع روی یک برنامه نیاز دارید و میخواهید مشکلات احتمالی قواعد seccomp را شناسایی کنید.
تمام توضیحات آرگومانها در بخش «trace - ردگیری فیلتر در زمان اجرا (trace - TRACE FILTER IN RUNTIME)» آمده است.
خروجی این زیردستور نتیجه شبیهسازی فراخوانیهای سیستمی رایج مانند execve، open و غیره است. اگر خود فیلتر قادر به مسدودسازی فراخوانیهای سیستمی نباشد، در یک نگاه متوجه آن خواهید شد.
خروجی نمونه برای این زیردستور در زیر آورده شده است، نمونههای با جزئیات بیشتر در بخش «مثالها (EXAMPLES)» یافت میشوند.
open -> ALLOW read -> ALLOW write -> ALLOW execve -> KILL execveat -> KILL mmap -> ALLOW mprotect -> ALLOW openat -> ALLOW sendfile -> ALLOW ptrace -> ERRNO(1) fork -> ALLOW
نکته (Note)
ابزار
seccomp-tools دارای
این
زیردستور
نیست.
مرجع دستور زبان متنی (TEXT GRAMMAR REFERENCE)
مهم (Important)
دستور
زبان از
نسخه ۴.۰ به
بعد به طور
چشمگیری
تغییر کرد،
چرا که ما
تحلیلگر
واژگانی (lexer)
را برای
خوانایی
بهتر توسط
انسان
بازنویسی
کردیم.
بستهبندی
سرهمساز
اکنون با
پیشوند #
مشخص
میشود
زیرا اکنون
یک توضیح (comment)
است. همچنین
line با label
جایگزین
شده است،
بنابراین
تحلیلگر
واژگانی
اکنون به
جای شماره
خط در فایل
TEXT، برای
تصمیمگیری
در مورد
مقصد پرش به
تعریف
برچسب
وابسته
است.
یک قالب معتبر TEXT در تعریف شبه-EBNF در نشانی زیر شرح داده شده است: https://github.com/dbgbgtf1/Ceccomp/issues/17#issuecomment-3610531705. اگر علاقهای به دانستن چیستی EBNF ندارید، لطفاً به خواندن مثالها ادامه دهید.
عملیاتهای BPF که در زیر شرح داده نشدهاند توسط هسته ممنوع هستند.
توضیحات و برچسبها (Comment and Label)
دستور ceccomp disasm موارد زیادی را نمایش میدهد، اما برخی از آنها برای asm اختیاری هستند.
#Label CODE JT JF K #--------------------------------- L0001: 0x06 0x00 0x00 0x7fff0000 return ALLOW #---------------------------------
هر متنی پس از # توسط asm مانند برخی زبانهای اسکریپتنویسی نادیده گرفته میشود.
خطوط خالی پذیرفته میشوند.
تعریف برچسب (Label) یک شناسه در ابتدای خط است که به : ختم میشود، مانند L0001. شناسه رشتهای است که با یک حرف الفبا شروع شده و فقط شامل نویسههای الفبایی-عددی و خط زیر (_) است. برچسب تنها زمانی ضروری است که مقصد یک goto باشد؛ این برچسبهای اضافی افزودهشده توسط disasm صرفاً برای خوانایی هستند. برای مثال در if ($A == 0) goto somewhere، عبارت somewhere یک برچسب است و باید پس از آن دستور اعلان شود. تعریف برچسب میتواند یک خط جداگانه را اشغال کند یا در ابتدای همان خط عبارت دستوری قرار گیرد.
مقادیر CODE، JT، JF و K تولیدشده توسط disasm به وسیله asm نادیده گرفته میشوند؛ asm تنها دستور مؤثر پس از K را پردازش میکند.
نکته (Note)
تفاوتهای
جزئی بین
ceccomp disasm و seccomp-tools disasm
وجود دارد،
در زیر یک
نمونه کلی
آورده شده
است. همچنین
برخی
عبارتها
متفاوت
هستند،
بنابراین
خروجی seccomp-tools را
بدون بررسی
به ceccomp هدایت
نکنید.
line CODE JT JF K ================================= 0000: 0x06 0x00 0x00 0x7fff0000 return ALLOW
انتساب (Assignment)
ثبات A میتواند مستقیماً با ویژگیهای seccomp تنظیم شود؛ اما به دلیل محدودیت هسته، ثبات X نمیتواند مستقیماً با ویژگیهای seccomp مقداردهی شود.
$A = $arch $A = $syscall_nr
برای انتساب فیلدهای ۶۴ بیتی به ثبات A، پیشوندهای low_ یا high_ مورد نیاز هستند.
$A = $low_pc $A = $high_pc $A = $low_args[0] $A = $high_args[0] ... $A = $low_args[5] $A = $high_args[5]
یک ویژگی ویژه sizeof(struct seccomp_data) است که میتواند مستقیماً به A یا X اختصاص یابد.
$A = $scmp_data_len $X = $scmp_data_len
حافظه موقت ۳۲ بیتی است و برای دسترسی به آن میتوانید از اندیس هگزادسیمال یا دهدهی استفاده کنید. هر دو ثبات A و X قابل انتساب هستند. اختصاص مقادیر بلافصل به A یا X در صورت تعیین صحیح مبنا با "0x" یا "0b"، هر قالبی از اعداد را میپذیرد.
$X = $mem[0] $A = $mem[0xf] $A = $mem[15] # both hex and dec index are OK $A = 0 $X = 0x3b $A = 0b1111 $A = 0333
شما همچنین میتوانید X را به A یا برعکس اختصاص دهید. اختصاص X یا A به حافظه موقت نیز کاملاً مجاز است.
$A = $X $X = $A $mem[3] = $X $mem[0x4] = $A
عملیات حسابی (Arithmetic Operations)
عملیاتهای گوناگونی را میتوان روی ثبات A اعمال کرد.
$A += 30 $A -= 4 $A *= 9 $A /= 1 $A &= 7 $A >>= 6
مقدار سمت راست عملگر میتواند X باشد.
$A &= $X $A |= $X $A ^= $X $A <<= $X
همچنین راهی برای منفی کردن مقدار A وجود دارد.
$A = -$A
پرش به جلو در صورت ... (Jump Downwards If ...)
پرش بدون شرط:
goto L3
پرش شرطی:
if ($A == execve) goto L3 if ($A != 1234) goto L4 if ($A & $X) goto L5 if !($A & 7) goto L6 if ($A <= $X) goto L7
در صورت درستی پرش به ... در صورت نادرستی پرش به ...:
if ($A > $X) goto L3, else goto L4 if ($A >= 4567) goto L5, else goto L6
تنها در شرطها، میتوانید عدد را با نام فراخوانی سیستمی یا نام معماری جایگزین کنید. در مثال بالا، 0x3b با execve جایگزین شده است. تمام نامهای فراخوانی سیستمی به شماره فراخوانی سیستمی متناظر در معماری انتخابی شما ترجمه خواهند شد. اگر میخواهید نام یک فراخوانی سیستمی را در یک معماری بیگانه (مغایر با معماری انتخابی شما) حل کنید، لطفاً نام معماری و یک نقطه را به ابتدای آن اضافه کنید. برای نمونه، اگر معماری شما x86_64 است و در حال نگارش قواعد برای aarch64 هستید، بدین صورت بنویسید:
if ($A == aarch64.read) goto 5
توجه داشته باشید که اگر معماری را با -a aarch64 به صورت دستی روی aarch64 تنظیم کنید، میتوانید aarch64. را در دستور ننویسید.
کد بازگشتی (Return Code)
مقدار بازگشتی ثبات A:
return $A
یا بازگرداندن یک مقدار بلافصل، همراه با فیلد اضافی در (). اقداماتی از جمله TRACE، TRAP و ERRNO یک فیلد اضافی را میپذیرند؛ در صورت عدم استفاده از ()، به صورت action(0) در نظر گرفته میشوند.
return 0x13371337 return KILL return KILL_PROCESS return TRAP(123) return ERRNO(0) return TRACE return TRACE(3) return LOG return NOTIFY
مثال کوتاه (Short Example)
متن TEXT زیر برای اسمبلر معتبر است و فراخوانیهای سیستمی execve و execveat را برای معماری amd64 مسدود میکند:
$A = $syscall_nr if ($A == execve) goto forbid if ($A == execveat) goto forbid return ALLOW forbid: return KILL
محدودیتها (RESTRICTIONS)
بخش asm در Ceccomp برای دستیابی به عملکرد بهتر، محدودیتهایی را روی TEXT اعمال میکند:
همچنین برای هر دو زیردستور asm و disasm، تعداد عبارتهای مؤثر (که میتوانند به BPF کدگذاری یا رمزگشایی شوند) باید کمتر یا مساوی ۴۰۹۶ باشد؛ این محدودیت توسط هسته لینوکس اعمال میشود.
یک نکته جالب درباره ceccomp asm: هر رنگ اولیه ANSI در فایل TEXT، برای نمونه \x1b[31m، هنگام پردازش نادیده گرفته میشود.
مثالها (EXAMPLES)
صفحه راهنما (manpage) قادر به نمایش تصاویر نیست، بنابراین لطفاً برای مشاهده مثالها به نسخه HTML این صفحه مراجعه فرمایید.
مخزن (REPO)
برای دسترسی به کدهای منبع به نشانی https://github.com/dbgbgtf1/Ceccomp مراجعه کنید. از ارسال درخواستهای ادغام (Pull Request) و گزارش مشکلات (Issue) استقبال میشود!
حق نشر © ۲۰۲۵-اکنون، توزیعشده تحت مجوز GPLv3 یا بالاتر.
نویسندگان (AUTHORS)
dbgbgtf
RocketDev
| 2026-06-15 | ceccomp 4.2.2 |