'\" t .\" Title: ceccomp .\" Author: dbgbgtf, RocketDev .\" Generator: Asciidoctor 2.0.26 .\" Date: 2026-06-15 .\" Manual: Ceccomp Manual .\" Source: ceccomp 4.2.2 .\" Language: Persian .\" .TH "CECCOMP" "1" "2026-06-15" "ceccomp 4.2.2" "Ceccomp Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 .nh .ad l .de URL \fI\\$2\fP <\\$1>\\$3 .. .als MTO URL .if \n[.g] \{\ . mso www.tmac . am URL . ad l . . . am MTO . ad l . . . LINKSTYLE blue R < > .\} .SH "نام (NAME)" ceccomp \- ابزار آزمون و بازرسی ساختار باینری‌های کامپایل‌شده .SH "خلاصه دستور (SYNOPSIS)" .sp .if n .RS 4 .nf .fam C usage: ceccomp [FILE] [\-q|\-\-quiet] [\-f|\-\-format FMT] [\-a|\-\-arch ARCH] [\-p|\-\-pid PID] [\-s|\-\-seize] [\-o|\-\-output FILE] [\-c|\-\-color WHEN] ... .fam .fi .if n .RE .SH "مفاهیم (CONCEPT)" .sp هسته لینوکس از فیلترهای BPF برای محدودسازی قواعد فراخوانی‌های سیستمی (syscall) استفاده می‌کند که از طریق فراخوانی سیستمی .B seccomp یا .B prctl اعمال می‌شوند. برای نمونه، در زیر یک فیلتر ساده به صورت قالب هگزادسیمال آورده شده است که فراخوانی سیستمی .B execve را مسدود می‌کند: .sp .if n .RS 4 .nf .fam C 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 .fam .fi .if n .RE .sp بخش ارائه‌شده به صورت هگزادسیمال، همان چیزی است که هسته دریافت کرده است و .B ceccomp آن را دریافت کرده و به متنی خوانا برای انسان دیس‌اسمبل می‌کند؛ به عنوان نمونه .B lineno در سمت چپ و .B statement در سمت راست قرار دارد. .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "مهم (Important)" .ps -1 .br .sp در ادامه، از .I TEXT به‌طور خلاصه برای متن خوانا برای انسان BPF، و از .I RAW به‌طور خلاصه برای فرمت خام BPF استفاده می‌شود؛ لطفاً این نکته را به خاطر داشته باشید. .sp .5v .RE .SH "توضیحات (DESCRIPTION)" .sp ابزار .B ceccomp دارای ۵ عملکرد اصلی است و در اصل یک نسخه بازنویسی‌شده به زبان C از .B seccomp\-tools می‌باشد. با این حال، برخی تغییرات ناسازگار بنیادین (breaking changes) وجود دارد که باید از آن‌ها مطلع باشید و در بخش مربوط به هر زیردستور مشخص شده‌اند. .SS "asm \- سرهم‌سازی (asm \- ASSEMBLE)" .sp .if n .RS 4 .nf .fam C ceccomp asm [\-c WHEN] [\-a ARCH] [\-f FMT] [TEXT] .fam .fi .if n .RE .sp سرهم‌سازی (اسمبل کردن) .I TEXT به .IR RAW . از این زیردستور برای جاسازی قواعد فیلتر دست‌نویس درون کدهای زبان C یا مشاهده کدهای اصلی یک فایل .I TEXT استفاده کنید. .sp WHEN .RS 4 تعیین می‌کند چه زمانی هشدارها و خطاها به صورت رنگی نمایش داده شوند. اگر مقدار آن بر روی .I auto تنظیم شده باشد، .B ceccomp هنگامی که مقصد خروجی یک «tty» باشد، رنگ‌ها را نمایش می‌دهد. مقادیر مجاز عبارتند از .IR auto ، .I never یا .IR always . مقدار پیش‌فرض .I auto است. .RE .sp ARCH .RS 4 تنظیم روی هر معماری که توسط libseccomp پشتیبانی می‌شود. این پارامتر برای تعیین شماره فراخوانی سیستمی واقعی در پس نام فراخوانی به کار می‌رود (برای نمونه، در معماری x86_64، می‌توانید مانند مثال ابتدایی بالا به جای .B 59 مستقیماً .B \(dqexecve\(dq را بنویسید). در صورت عدم تعیین، معماری سیستم شما از طریق .B uname شناسایی می‌شود. مقدار پیش‌فرض روی سیستم شما x86_64 است. .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp از .I نسخه ۴.۰ به بعد، ترتیب بایت‌ها (Endianness) مد نظر قرار می‌گیرد. اگر ترتیب بایت‌های معماری هدف .RB ( ARCH ) با ترتیب بایت‌های ماشین متفاوت باشد، فیلترها (بخش‌های CODE و K) قبل از خروجی دادن معکوس خواهند شد. .sp .5v .RE .sp FMT .RS 4 تعیین می‌کند که .B ceccomp چگونه کدهای bpf باینری را تولید کند. مقادیر مجاز می‌توانند .IR hexfmt ، .I hexline یا .I raw باشند. نمونه‌های خروجی در بخش «مثال‌ها (EXAMPLES)» آورده شده‌اند. مقدار پیش‌فرض .I hexline است. .RE .sp TEXT .RS 4 یک نام فایل اختیاری می‌گیرد تا مشخص کند کدام فایل حاوی .I TEXT باید اسمبل شود. در صورت عدم تعیین، از ورودی استاندارد .RI ( stdin ) خوانده خواهد شد. کاراکتر .B \- به عنوان .I stdin در نظر گرفته می‌شود. .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "مهم (Important)" .ps -1 .br .sp نحو اسمبل کردن از .I نسخه ۴.۰ به بعد تغییرات زیادی داشته است؛ لطفاً بخش مرجع دستور زبان در ادامه را بررسی کنید! .sp .5v .RE .sp لطفاً بخش «مرجع دستور زبان متنی (TEXT GRAMMAR REFERENCE)» را مطالعه کنید تا با نحوه نگارش دستی یک قاعده آشنا شوید. چند نمونه در بخش «مثال‌ها (EXAMPLES)» نمایش داده خواهد شد. .TS allbox tab(:); ltB ltB. T{ .sp دستور (Command) T}:T{ .sp تفاوت (Difference) T} .T& lt lt. T{ .sp \f(CRseccomp\-tools asm\fP T}:T{ .sp از دستور زبان اختصاصی خود برای اسمبل کردن استفاده می‌کند که تا حدی شبیه اسکریپت است؛ می‌تواند متن‌های نامعتبر \fITEXT\fP را که توسط هسته رد می‌شوند اسمبل کند T} T{ .sp \f(CRceccomp asm\fP T}:T{ .sp می‌توانید مستقیماً خروجی \f(CRdisasm\fP را به \f(CRasm\fP بدهید، نیازی به یادگیری دستور زبان جدید نیست؛ ورودی پیش‌فرض را از \f(CRstdin\fP دریافت می‌کند T} .TE .sp .SS "disasm \- واسازی (disasm \- DISASSEMBLE)" .sp .if n .RS 4 .nf .fam C ceccomp disasm [\-c WHEN] [\-a ARCH] [RAW] .fam .fi .if n .RE .sp واسازی (دیس‌اسمبل کردن) .I RAW به .IR TEXT . اگر نتوانستید از طریق .B trace به فیلتر دسترسی پیدا کنید و مجبور به استخراج دستی فیلتر شدید، از این زیردستور برای مشاهده عملکرد فیلتر استفاده کنید. .sp WHEN .RS 4 توضیحات این آرگومان در بخش «asm \- سرهم‌سازی (asm \- ASSEMBLE)» آمده است. دستور .B disasm ممکن است متن‌های بیشتری را به صورت رنگی شامل برجسته‌سازی نحوی برای .I TEXT چاپ کند. .RE .sp ARCH .RS 4 تنظیم روی هر معماری که توسط libseccomp پشتیبانی می‌شود. برای تعیین چگونگی ترجمه شماره فراخوانی سیستمی فیلترشده در فیلتر .I RAW به نام فراخوانی سیستمی استفاده خواهد شد (برای نمونه، در معماری x86_64، در صورتی که مقایسه با syscall_nr باشد، شماره .B 0x3b به .B execve ترجمه می‌شود؛ مثال ابتدایی بالا را ببینید). مقدار پیش‌فرض روی سیستم شما x86_64 است. .RE .sp RAW .RS 4 یک فایل باینری حاوی کدهای خام BPF. در صورت عدم تنظیم، ورودی را از .I stdin دریافت می‌کند. علامت .B \- به عنوان .I stdin در نظر گرفته می‌شود. این فایل وابسته به معماری است، بنابراین ممکن است روی معماری‌های متفاوت قابل حمل نباشد. .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp از .I نسخه ۴.۰ به بعد، ترتیب بایت‌ها (Endianness) مد نظر قرار می‌گیرد. اگر ترتیب بایت‌های معماری هدف .RB ( ARCH ) با ترتیب بایت‌های ماشین متفاوت باشد، فیلترها (بخش‌های CODE و K) قبل از رمزگشایی معکوس خواهند شد. .sp .5v .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp ابزار ceccomp تنها زمانی تلاش می‌کند شماره فراخوانی سیستمی را ذیل یک معماری حل‌وفصل کند که در همان خط، معماری قابل تشخیص باشد. در معماری‌های بیگانه (مغایر با معماری تعیین‌شده)، نام معماری بیگانه به ابتدای نام فراخوانی سیستمی اضافه خواهد شد. ممکن است متوجه شوید در برخی موارد seccomp\-tools قادر به حل نام است در حالی که ceccomp چنین نیست؛ این رفتار عمدی است زیرا معماری دقیقاً مشخص نشده است. .sp .5v .RE .TS allbox tab(:); ltB ltB. T{ .sp دستور (Command) T}:T{ .sp تفاوت (Difference) T} .T& lt lt. T{ .sp \f(CRseccomp\-tools disasm\fP T}:T{ .sp در قالب اختصاصی خود دیس‌اسمبل می‌کند؛ هرگز معتبر بودن فیلتر را بررسی نمی‌کند T} T{ .sp \f(CRceccomp disasm\fP T}:T{ .sp در قالب ceccomp دیس‌اسمبل می‌کند و به طور پیش‌فرض ورودی را از \f(CRstdin\fP می‌گیرد؛ معماری را به طور دقیق بررسی می‌کند و همیشه نام معماری بیگانه را نمایش می‌دهد T} .TE .sp .SS "emu \- شبیه‌سازی (emu \- EMULATE)" .sp .if n .RS 4 .nf .fam C ceccomp emu [\-c WHEN] [\-a ARCH] [\-q] TEXT SYSCALL_NAME/SYSCALL_NR [ARGS[0] ARGS[1] ... ARGS[5] PC] .fam .fi .if n .RE .sp شبیه‌سازی آنچه اتفاق خواهد افتاد اگر فراخوانی .B syscall(SYSCALL_NR, ARGS[0], ARGS[1], .\|.\|., ARGS[5]) از مقدار .B PC طبق قواعد شرح‌داده‌شده در .I TEXT صدا زده شود. از آن برای مشاهده نتیجه بدون نیاز به اجرای واقعی در برنامه یا مواقعی که نمی‌خواهید قاعده فیلتر را به صورت دستی بازرسی کنید استفاده نمایید. این زیردستور می‌تواند برای بررسی خودکار فیلتر به کار رود. .sp WHEN .RS 4 توضیحات این آرگومان در بخش «asm \- سرهم‌سازی (asm \- ASSEMBLE)» آمده است. دستور .B emu ممکن است متون بیشتری را با رنگ چاپ کند؛ از جمله برجسته‌سازی نحوی برای .I TEXT و عبارت‌های رد شده. .RE .sp SYSCALL_NAME/SYSCALL_NR .RS 4 اگر .B SYSCALL_NAME (مانند .BR execve ) را تنظیم کنید، ابتدا به .B SYSCALL_NR تحت معماری .B ARCH ترجمه می‌شود؛ یا اینکه می‌توانید مستقیماً .B SYSCALL_NR (مانند .BR 59 ) را مشخص کنید. سپس این شماره با فیلتر bpf آزموده می‌شود تا نتیجه آن فراخوانی سیستمی مشخص گردد. این آرگومان اختیاری نیست و تنظیم آن الزامی است. .RE .sp ARGS[0\-5] and PC .RS 4 مقادیر ثبات‌ها هنگام فراخوانی سیستمی. برای نمونه، در معماری x86_64، این مقادیر معادل ثبات‌های .IR rdi ، .IR rsi ، .IR rdx ، .IR r10 ، .IR r8 ، .I r9 و .I rip هستند. مقدار پیش‌فرض آن‌ها ۰ است. .RE .sp ARCH .RS 4 توضیحات این آرگومان در بخش «asm \- سرهم‌سازی (asm \- ASSEMBLE)» آمده است. .RE .sp TEXT .RS 4 یک نام فایل می‌گیرد تا مشخص کند کدام فایل حاوی قاعده .I TEXT باید آزموده شود. توجه داشته باشید که نام فایل نمی‌تواند نادیده گرفته شود زیرا ceccomp نمی‌تواند تشخیص دهد که آیا یک آرگومان مکانی، فراخوانی سیستمی است یا نام فایل. برای اشاره به ورودی استاندارد .RI ( stdin ) از .B \- استفاده کنید. .RE .sp \-q, \-\-quiet .RS 4 تنها نتیجه ارزیابی فیلتر را چاپ می‌کند. برای نمونه، اگر آخرین عبارت شبیه‌سازی‌شده .B return KILL باشد، آنگاه .B KILL چاپ خواهد شد. .RE .TS allbox tab(:); ltB ltB. T{ .sp دستور (Command) T}:T{ .sp تفاوت (Difference) T} .T& lt lt. T{ .sp \f(CRseccomp\-tools emu\fP T}:T{ .sp یک فایل \fIRAW\fP را به عنوان ورودی می‌گیرد T} T{ .sp \f(CRceccomp emu\fP T}:T{ .sp یک فایل \fITEXT\fP را به عنوان ورودی می‌گیرد و به طور پیش‌فرض از \f(CRstdin\fP می‌خواند؛ امکان تنظیم \fBPC\fP وجود دارد T} .TE .sp .SS "trace \- ردگیری فیلتر در زمان اجرا (trace \- TRACE FILTER IN RUNTIME)" .sp .if n .RS 4 .nf .fam C ceccomp trace [\-c WHEN] [\-q] [\-o FILE] PROGRAM [program\-args] [\-c WHEN] [\-q] \-p PID [\-s] .fam .fi .if n .RE .sp خط اول فیلترهایی را که .B PROGRAM در زمان اجرا با ردگیری آن بارگذاری می‌کند ضبط می‌نماید؛ خط دوم فیلترهای seccomp را از .B PID استخراج می‌کند یا .B PID را برای ضبط فیلترهای seccomp بعدی ردگیری می‌نماید؛ پس از واکشی فیلترها، آن‌ها را در قالب .I TEXT چاپ می‌کند. شما فقط می‌توانید یکی از دو ساختار فوق را انتخاب کنید. اگر اجرای برنامه ساده‌ترین راه برای واکشی فیلترهای bpf است یا برنامه‌ای با فیلترهای seccomp نصب‌شده منتظر ورودی است، از این حالت استفاده کنید. .sp WHEN .RS 4 توضیحات این آرگومان در بخش «asm \- سرهم‌سازی (asm \- ASSEMBLE)» آمده است. دستور .B trace ممکن است متن‌های بیشتری را به صورت رنگی شامل برجسته‌سازی نحوی برای .I TEXT چاپ کند. .RE .sp FILE .RS 4 زمانی که .B PROGRAM خروجی زیادی در خطای استاندارد .RI ( stderr ) تولید کند می‌تواند مفید باشد. ابزار .B ceccomp به کاربر اجازه می‌دهد تا .I stdin و .I stdout را برای محدود کردن ورودی و خروجی .B PROGRAM ببندد، بنابراین .B ceccomp هنگام اجرای .B PROGRAM از .I stderr برای چاپ پیام‌ها استفاده می‌کند. اگر می‌خواهید .I TEXT را در فایل دیگری ببینید، .B FILE را تنظیم کنید. با علامت .B \- مانند .I stdout رفتار می‌شود. .RE .sp PROGRAM .RS 4 برنامه‌ای را که می‌خواهید اجرا کنید مشخص می‌کند، و .B program\-args آرگومان‌های آن هستند؛ دقیقاً مانند اجرای دستور پوسته .BR "exec PROGRAM program\-args" . .RE .sp PID .RS 4 شناسه فرآیندی .RB ( PID ) را که می‌خواهید بازرسی کنید تعیین می‌کند. پارامتر .B PID با .B PROGRAM تداخل دارد؛ در یک دستور یا می‌توانید برنامه‌ای را به صورت پویا اجرا کنید یا یک pid را بررسی نمایید. بدون سوییچ .BR \-s ، حالت trace pid تلاش خواهد کرد فیلتر seccomp موجود در .B PID را از طریق .B ptrace(PTRACE_SECCOMP_GET_FILTER) استخراج کند که ممکن است در برخی سیستم‌ها در دسترس نباشد. .RE .sp \-s, \-\-seize .RS 4 \fBتنها برای حالت TRACE PID در دسترس است.\fP تنظیم این سوییچ رفتار trace pid را تغییر می‌دهد تا به .B PID متصل (attach) شده و مانند حالت trace prog به ردگیری برای بارگذاری فیلترهای seccomp ادامه دهد. \fIاین گزینه در نسخه ۴.۰ اضافه شده است.\fP .RE .sp \-q, \-\-quiet .RS 4 برای فرونشاندن و جلوگیری از چاپ پیام‌های اضافی .B [INFO] هنگام انشعاب فرآیند (forking)، خروج فرآیند یا بارگذاری فیلتر seccomp به کار می‌رود. \fIاین گزینه در نسخه ۴.۰ اضافه شده است.\fP .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp برای استخراج فیلترها از .BR PID ، مجوز .B CAP_SYS_ADMIN (بدون سوییچ .BR \-s ) و احتمالاً .B CAP_SYS_PTRACE مورد نیاز است؛ ساده‌ترین راه برای کسب آن‌ها اجرای .B ceccomp با .B sudo است. .sp .5v .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp از .I نسخه ۳.۱ به بعد، قابلیت ردگیری چندین فرآیند معرفی شد و هنگامی که فرآیند تحت ردگیری انشعاب می‌یابد (fork)، تفکیک می‌شود یا خارج می‌گردد، یک پیام INFO اضافی چاپ می‌شود. با اجرای دستوری مانند .B "ceccomp trace \-q PROG 2>/dev/null" می‌توانید از نمایش آن صرف‌نظر کنید. .sp .5v .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp از .I نسخه ۴.۲ به بعد، زیردستور .B dump به عنوان نام مستعار (alias) برای .B trace اضافه شد تا سازگاری با .B seccomp\-tools حفظ شود. .sp .5v .RE .TS allbox tab(:); ltB ltB. T{ .sp دستور (Command) T}:T{ .sp تفاوت (Difference) T} .T& lt lt. T{ .sp \f(CRseccomp\-tools dump\fP T}:T{ .sp تنظیم قالب خروجی امکان‌پذیر است؛ هر فیلتر می‌تواند در فایل متفاوتی ذخیره شود؛ فرآیند \fBPROGRAM\fP را پس از \fBLIMIT\fP بار بارگذاری فیلتر متوقف (kill) می‌کند؛ دستور \fBPROGRAM\fP را درون \f(CRsh \-c\fP کپسوله می‌کند T} T{ .sp \f(CRceccomp trace\fP یا \f(CRceccomp dump\fP T}:T{ .sp همه فیلترها در یک فایل واحد خروجی داده می‌شوند؛ هرگز \fBPROGRAM\fP را kill نمی‌کند؛ برنامه \fBPROGRAM\fP مستقیماً راه‌اندازی می‌شود و نیازی به \f(CR./\fP نیست؛ هنگام fork کردن فرآیند پیام صریح چاپ می‌کند؛ قادر است برای ثبت پویای فیلتر seccomp به pid متصل شود T} .TE .sp .SS "probe \- آزمون فوری فراخوانی‌های سیستمی متداول (probe \- TEST COMMON SYSCALLS INSTANTLY)" .sp .if n .RS 4 .nf .fam C ceccomp probe [\-c WHEN] [\-o FILE] [\-q] PROGRAM [program\-args] .fam .fi .if n .RE .sp اجرای .B PROGRAM همراه با .B program\-args برای ضبط .B نخستین (FIRST) فیلتر seccomp و سپس پایان دادن (kill) به همه فرزندان. از این زیردستور زمانی استفاده کنید که به یک بررسی سریع روی یک برنامه نیاز دارید و می‌خواهید مشکلات احتمالی قواعد seccomp را شناسایی کنید. .sp تمام توضیحات آرگومان‌ها در بخش «trace \- ردگیری فیلتر در زمان اجرا (trace \- TRACE FILTER IN RUNTIME)» آمده است. .sp خروجی این زیردستور نتیجه شبیه‌سازی فراخوانی‌های سیستمی رایج مانند .IR execve ، .I open و غیره است. اگر خود فیلتر قادر به مسدودسازی فراخوانی‌های سیستمی نباشد، در یک نگاه متوجه آن خواهید شد. .sp خروجی نمونه برای این زیردستور در زیر آورده شده است، نمونه‌های با جزئیات بیشتر در بخش «مثال‌ها (EXAMPLES)» یافت می‌شوند. .sp .if n .RS 4 .nf .fam C open\& \-> ALLOW read\& \-> ALLOW write\& \-> ALLOW execve\& \-> KILL execveat\& \-> KILL mmap\& \-> ALLOW mprotect\& \-> ALLOW openat\& \-> ALLOW sendfile\& \-> ALLOW ptrace\& \-> ERRNO(1) fork\& \-> ALLOW .fam .fi .if n .RE .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp ابزار .B seccomp\-tools دارای این زیردستور نیست. .sp .5v .RE .SH "مرجع دستور زبان متنی (TEXT GRAMMAR REFERENCE)" .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "مهم (Important)" .ps -1 .br .sp دستور زبان از .I نسخه ۴.۰ به بعد به طور چشمگیری تغییر کرد، چرا که ما تحلیل‌گر واژگانی (lexer) را برای خوانایی بهتر توسط انسان بازنویسی کردیم. بسته‌بندی سرهم‌ساز اکنون با پیشوند .B # مشخص می‌شود زیرا اکنون یک توضیح (comment) است. همچنین .I line با .I label جایگزین شده است، بنابراین تحلیل‌گر واژگانی اکنون به جای شماره خط در فایل .IR TEXT ، برای تصمیم‌گیری در مورد مقصد پرش به تعریف برچسب وابسته است. .sp .5v .RE .sp یک قالب معتبر .I TEXT در تعریف شبه\-EBNF در نشانی زیر شرح داده شده است: .URL "https://github.com/dbgbgtf1/Ceccomp/issues/17#issuecomment\-3610531705" "" "." اگر علاقه‌ای به دانستن چیستی EBNF ندارید، لطفاً به خواندن مثال‌ها ادامه دهید. .sp عملیات‌های BPF که در زیر شرح داده نشده‌اند توسط هسته ممنوع هستند. .SS "توضیحات و برچسب‌ها (Comment and Label)" .sp دستور .B ceccomp disasm موارد زیادی را نمایش می‌دهد، اما برخی از آن‌ها برای asm اختیاری هستند. .sp .if n .RS 4 .nf .fam C #Label\& CODE\& JT\& JF\& K #\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- L0001: 0x06 0x00 0x00 0x7fff0000 return ALLOW #\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- .fam .fi .if n .RE .sp هر متنی پس از .B # توسط asm مانند برخی زبان‌های اسکریپت‌نویسی نادیده گرفته می‌شود. .sp خطوط خالی پذیرفته می‌شوند. .sp تعریف برچسب (Label) یک شناسه در ابتدای خط است که به .B : ختم می‌شود، مانند .BR L0001 . شناسه رشته‌ای است که با یک حرف الفبا شروع شده و فقط شامل نویسه‌های الفبایی\-عددی و خط زیر .RB ( _ ) است. برچسب تنها زمانی ضروری است که مقصد یک .B goto باشد؛ این برچسب‌های اضافی افزوده‌شده توسط disasm صرفاً برای خوانایی هستند. برای مثال در .BR "if ($A == 0) goto somewhere" ، عبارت .B somewhere یک برچسب است و باید پس از آن دستور اعلان شود. تعریف برچسب می‌تواند یک خط جداگانه را اشغال کند یا در ابتدای همان خط عبارت دستوری قرار گیرد. .sp مقادیر .IR CODE ، .IR JT ، .I JF و .I K تولیدشده توسط disasm به وسیله asm نادیده گرفته می‌شوند؛ asm تنها دستور مؤثر پس از .I K را پردازش می‌کند. .if n .sp .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 .B "نکته (Note)" .ps -1 .br .sp تفاوت‌های جزئی بین .B ceccomp disasm و .B seccomp\-tools disasm وجود دارد، در زیر یک نمونه کلی آورده شده است. همچنین برخی عبارت‌ها متفاوت هستند، بنابراین خروجی seccomp\-tools را بدون بررسی به ceccomp هدایت نکنید. .sp .5v .RE .sp .if n .RS 4 .nf .fam C line\& CODE\& JT\& JF\& K ================================= 0000: 0x06 0x00 0x00 0x7fff0000\& return ALLOW .fam .fi .if n .RE .SS "انتساب (Assignment)" .sp ثبات .B A می‌تواند مستقیماً با ویژگی‌های seccomp تنظیم شود؛ اما به دلیل محدودیت هسته، ثبات .B X نمی‌تواند مستقیماً با ویژگی‌های seccomp مقداردهی شود. .sp .if n .RS 4 .nf .fam C $A = $arch $A = $syscall_nr .fam .fi .if n .RE .sp برای انتساب فیلدهای ۶۴ بیتی به ثبات .BR A ، پیشوندهای .B low_ یا .B high_ مورد نیاز هستند. .sp .if n .RS 4 .nf .fam C $A = $low_pc $A = $high_pc $A = $low_args[0] $A = $high_args[0] \&... $A = $low_args[5] $A = $high_args[5] .fam .fi .if n .RE .sp یک ویژگی ویژه .B sizeof(struct seccomp_data) است که می‌تواند مستقیماً به .B A یا .B X اختصاص یابد. .sp .if n .RS 4 .nf .fam C $A = $scmp_data_len $X = $scmp_data_len .fam .fi .if n .RE .sp حافظه موقت ۳۲ بیتی است و برای دسترسی به آن می‌توانید از اندیس هگزادسیمال یا ده‌دهی استفاده کنید. هر دو ثبات .B A و .B X قابل انتساب هستند. اختصاص مقادیر بلافصل به .B A یا .B X در صورت تعیین صحیح مبنا با \(dq0x\(dq یا \(dq0b\(dq، هر قالبی از اعداد را می‌پذیرد. .sp .if n .RS 4 .nf .fam C $X = $mem[0] $A = $mem[0xf] $A = $mem[15] # both hex and dec index are OK $A = 0 $X = 0x3b $A = 0b1111 $A = 0333 .fam .fi .if n .RE .sp شما همچنین می‌توانید .B X را به .B A یا برعکس اختصاص دهید. اختصاص .B X یا .B A به حافظه موقت نیز کاملاً مجاز است. .sp .if n .RS 4 .nf .fam C $A = $X $X = $A $mem[3] = $X $mem[0x4] = $A .fam .fi .if n .RE .SS "عملیات حسابی (Arithmetic Operations)" .sp عملیات‌های گوناگونی را می‌توان روی ثبات .B A اعمال کرد. .sp .if n .RS 4 .nf .fam C $A += 30 $A \-= 4 $A *= 9 $A /= 1 $A &= 7 $A >>= 6 .fam .fi .if n .RE .sp مقدار سمت راست عملگر می‌تواند .B X باشد. .sp .if n .RS 4 .nf .fam C $A &= $X $A |= $X $A ^= $X $A <<= $X .fam .fi .if n .RE .sp همچنین راهی برای منفی کردن مقدار .B A وجود دارد. .sp .if n .RS 4 .nf .fam C $A = \-$A .fam .fi .if n .RE .SS "پرش به جلو در صورت .\|.\|. (Jump Downwards If .\|.\|.)" .sp پرش بدون شرط: .sp .if n .RS 4 .nf .fam C goto L3 .fam .fi .if n .RE .sp پرش شرطی: .sp .if n .RS 4 .nf .fam C 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 .fam .fi .if n .RE .sp در صورت درستی پرش به .\|.\|. در صورت نادرستی پرش به .\|.\|.: .sp .if n .RS 4 .nf .fam C if ($A > $X) goto L3, else goto L4 if ($A >= 4567) goto L5, else goto L6 .fam .fi .if n .RE .sp \fBتنها\fP در شرط‌ها، \fBمی‌توانید\fP عدد را با نام فراخوانی سیستمی یا نام معماری جایگزین کنید. در مثال بالا، .B 0x3b با .B execve جایگزین شده است. تمام نام‌های فراخوانی سیستمی به شماره فراخوانی سیستمی متناظر در معماری انتخابی شما ترجمه خواهند شد. اگر می‌خواهید نام یک فراخوانی سیستمی را در یک معماری بیگانه (مغایر با معماری انتخابی شما) حل کنید، لطفاً نام معماری و یک نقطه را به ابتدای آن اضافه کنید. برای نمونه، اگر معماری شما x86_64 است و در حال نگارش قواعد برای .I aarch64 هستید، بدین صورت بنویسید: .sp .if n .RS 4 .nf .fam C if ($A == aarch64.read) goto 5 .fam .fi .if n .RE .sp توجه داشته باشید که اگر معماری را با .B \-a aarch64 به صورت دستی روی .I aarch64 تنظیم کنید، می‌توانید .B aarch64. را در دستور ننویسید. .SS "کد بازگشتی (Return Code)" .sp مقدار بازگشتی ثبات .BR A : .sp .if n .RS 4 .nf .fam C return $A .fam .fi .if n .RE .sp یا بازگرداندن یک مقدار بلافصل، همراه با فیلد اضافی در .BR () . اقداماتی از جمله .IR TRACE ، .I TRAP و .I ERRNO یک فیلد اضافی را می‌پذیرند؛ در صورت عدم استفاده از .BR () ، به صورت .B action(0) در نظر گرفته می‌شوند. .sp .if n .RS 4 .nf .fam C return 0x13371337 return KILL return KILL_PROCESS return TRAP(123) return ERRNO(0) return TRACE return TRACE(3) return LOG return NOTIFY .fam .fi .if n .RE .SS "مثال کوتاه (Short Example)" .sp متن .I TEXT زیر برای اسمبلر معتبر است و فراخوانی‌های سیستمی .B execve و .B execveat را برای معماری amd64 مسدود می‌کند: .sp .if n .RS 4 .nf .fam C $A = $syscall_nr if ($A == execve) goto forbid if ($A == execveat) goto forbid return ALLOW forbid: return KILL .fam .fi .if n .RE .SH "محدودیت‌ها (RESTRICTIONS)" .sp بخش asm در Ceccomp برای دستیابی به عملکرد بهتر، محدودیت‌هایی را روی .I TEXT اعمال می‌کند: .sp .RS 4 .ie n \{\ \h'-04' 1.\h'+01'\c .\} .el \{\ . sp -1 . IP " 1." 4.2 .\} کاراکتر باینری .B \*(Aq\(rs0\*(Aq (نال‌بایت) نباید در .I TEXT وجود داشته باشد، زیرا یک فایل متنی است. .RE .sp .RS 4 .ie n \{\ \h'-04' 2.\h'+01'\c .\} .el \{\ . sp -1 . IP " 2." 4.2 .\} طول هر خط باید کمتر از ۳۸۴ \fBبایت\fP باشد. .RE .sp .RS 4 .ie n \{\ \h'-04' 3.\h'+01'\c .\} .el \{\ . sp -1 . IP " 3." 4.2 .\} یک فایل .I TEXT باید کمتر از ۱۶۳۸۴ خط داشته باشد. .RE .sp .RS 4 .ie n \{\ \h'-04' 4.\h'+01'\c .\} .el \{\ . sp -1 . IP " 4." 4.2 .\} حجم یک فایل .I TEXT باید کمتر از ۴ مبی‌بایت (4 MiB) باشد. .RE .sp همچنین برای هر دو زیردستور asm و disasm، تعداد عبارت‌های مؤثر (که می‌توانند به BPF کدگذاری یا رمزگشایی شوند) باید کمتر یا مساوی ۴۰۹۶ باشد؛ این محدودیت توسط هسته لینوکس اعمال می‌شود. .sp یک نکته جالب درباره ceccomp asm: هر رنگ اولیه ANSI در فایل .IR TEXT ، برای نمونه .BR \(rsx1b[31m ، هنگام پردازش نادیده گرفته می‌شود. .SH "مثال‌ها (EXAMPLES)" .sp صفحه راهنما (manpage) قادر به نمایش تصاویر نیست، بنابراین لطفاً برای مشاهده مثال‌ها به نسخه HTML این صفحه مراجعه فرمایید. .SH "مخزن (REPO)" .sp برای دسترسی به کدهای منبع به نشانی .URL "https://github.com/dbgbgtf1/Ceccomp" "" "" مراجعه کنید. از ارسال درخواست‌های ادغام (Pull Request) و گزارش مشکلات (Issue) استقبال می‌شود! .sp حق نشر \(co ۲۰۲۵\-اکنون، توزیع‌شده تحت مجوز GPLv3 یا بالاتر. .SH "نویسندگان (AUTHORS)" .sp dbgbgtf .sp RocketDev