<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_2019%2FSECCOMP</id>
	<title>Безопасность компьютерных систем 2019/SECCOMP - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_2019%2FSECCOMP"/>
	<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_2019/SECCOMP&amp;action=history"/>
	<updated>2026-06-06T18:17:15Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wikicshse.ru/index.php?title=%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_2019/SECCOMP&amp;diff=2030&amp;oldid=prev</id>
		<title>imported&gt;Gamajun: Migrated current public revision from wiki.cs.hse.ru</title>
		<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC_2019/SECCOMP&amp;diff=2030&amp;oldid=prev"/>
		<updated>2019-11-25T13:40:02Z</updated>

		<summary type="html">&lt;p&gt;Migrated current public revision from wiki.cs.hse.ru&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Linux seccomp ==&lt;br /&gt;
Ссылки для изучения:&lt;br /&gt;
&lt;br /&gt;
# Рекомендуемая основная презентация (пригодится для выполнения бонусного задания к заданию 3): http://man7.org/conf/lceu2016/limiting_kernel_attack_surface_with_seccomp-ContainerCon.eu_2016-Kerrisk.pdf&lt;br /&gt;
# https://eigenstate.org/notes/seccomp&lt;br /&gt;
# Kafel - язык для конструирования политик seccomp (not an official Google product) https://github.com/google/kafel&lt;br /&gt;
&lt;br /&gt;
== Тестовый пример 1 ==&lt;br /&gt;
&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;linux/seccomp.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;sys/prctl.h&amp;gt;&lt;br /&gt;
  int main () {&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
  printf(&amp;quot;Step 1: no restrictions yet\n&amp;quot;);&lt;br /&gt;
  prctl (PR_SET_SECCOMP, SECCOMP_MODE_STRICT);&lt;br /&gt;
  printf (&amp;quot;Step 2: entering the strict mode. Only read(), write(), exit() and sigreturn() syscalls    are allowed\n&amp;quot;);&lt;br /&gt;
  pid = getpid ();&lt;br /&gt;
  printf (&amp;quot;!!YOU SHOULD NOT SEE THIS!! My PID = %d&amp;quot;, pid);&lt;br /&gt;
  return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Тестовый пример 2 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;seccomp.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;sys/fcntl.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
  int main() {&lt;br /&gt;
    pid_t pid;&lt;br /&gt;
    scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_TRAP);&lt;br /&gt;
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);&lt;br /&gt;
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);&lt;br /&gt;
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(sigreturn), 0);&lt;br /&gt;
    seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);&lt;br /&gt;
    printf (&amp;quot;No restrictions yet\n&amp;quot;);&lt;br /&gt;
    seccomp_load(ctx);&lt;br /&gt;
    pid = getpid();&lt;br /&gt;
    printf(&amp;quot;!! YOU SHOULD NOT SEE THIS!! My PID is%d\n&amp;quot;, pid);&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Тестовый пример 3 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*************************************************************************\&lt;br /&gt;
*                  Copyright (C) Michael Kerrisk, 2016.                   *&lt;br /&gt;
*                                                                         *&lt;br /&gt;
* This program is free software. You may use, modify, and redistribute it *&lt;br /&gt;
* under the terms of the GNU General Public License as published by the   *&lt;br /&gt;
* Free Software Foundation, either version 3 or (at your option) any      *&lt;br /&gt;
* later version. This program is distributed without any warranty.  See   *&lt;br /&gt;
* the file COPYING.gpl-v3 for details.                                    *&lt;br /&gt;
\*************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/* Supplementary program for Chapter Z */&lt;br /&gt;
&lt;br /&gt;
/* seccomp_deny.c&lt;br /&gt;
   A simple seccomp filter example. Install a filter that kills the process&lt;br /&gt;
   if open() is called.&lt;br /&gt;
*/&lt;br /&gt;
#define _GNU_SOURCE&lt;br /&gt;
#include &amp;lt;stddef.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/audit.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/syscall.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/filter.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/seccomp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/prctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;  /* Type definitions used by many programs */&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;      /* Standard I/O functions */&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;     /* Prototypes of commonly used library functions, plus EXIT_SUCCESS and EXIT_FAILURE constants */&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;     /* Prototypes for many system calls */&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;      /* Declares errno and defines error constants */&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;     /* Commonly used string-handling functions */&lt;br /&gt;
&lt;br /&gt;
static int&lt;br /&gt;
seccomp(unsigned int operation, unsigned int flags, void *args)&lt;br /&gt;
{&lt;br /&gt;
    return syscall(__NR_seccomp, operation, flags, args);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
install_filter(void)&lt;br /&gt;
{&lt;br /&gt;
    struct sock_filter filter[] = {&lt;br /&gt;
        /* Load architecture */&lt;br /&gt;
&lt;br /&gt;
        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,&lt;br /&gt;
                (offsetof(struct seccomp_data, arch))),&lt;br /&gt;
&lt;br /&gt;
        /* Kill process if the architecture is not what we expect */&lt;br /&gt;
&lt;br /&gt;
        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, AUDIT_ARCH_X86_64, 1, 0),&lt;br /&gt;
        BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_KILL),&lt;br /&gt;
&lt;br /&gt;
        /* Load system call number */&lt;br /&gt;
&lt;br /&gt;
        BPF_STMT(BPF_LD | BPF_W | BPF_ABS,&lt;br /&gt;
                 (offsetof(struct seccomp_data, nr))),&lt;br /&gt;
&lt;br /&gt;
        /* Allow system calls other than open() */&lt;br /&gt;
&lt;br /&gt;
        BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_open, 1, 0),&lt;br /&gt;
        BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW),&lt;br /&gt;
&lt;br /&gt;
        /* Kill process on open() */&lt;br /&gt;
&lt;br /&gt;
        BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_KILL)&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    struct sock_fprog prog = {&lt;br /&gt;
        .len = (unsigned short) (sizeof(filter) / sizeof(filter[0])),&lt;br /&gt;
        .filter = filter,&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    if (seccomp(SECCOMP_SET_MODE_FILTER, 0, &amp;amp;prog) == -1)&lt;br /&gt;
        perror(&amp;quot;seccomp&amp;quot;);&lt;br /&gt;
    /* On Linux 3.16 and earlier, we must instead use:&lt;br /&gt;
&lt;br /&gt;
            if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &amp;amp;prog))&lt;br /&gt;
                errExit(&amp;quot;prctl-PR_SET_SECCOMP&amp;quot;);&lt;br /&gt;
    */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0))&lt;br /&gt;
        perror(&amp;quot;prctl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    install_filter();&lt;br /&gt;
&lt;br /&gt;
    if (open(&amp;quot;/tmp/a&amp;quot;, O_RDONLY) == -1)&lt;br /&gt;
        perror(&amp;quot;open&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;We shouldn&amp;#039;t see this message\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    exit(EXIT_SUCCESS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Тестовый пример 4 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stddef.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/prctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/syscall.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;linux/filter.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/seccomp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/audit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ArchField offsetof(struct seccomp_data, arch)&lt;br /&gt;
&lt;br /&gt;
#define Allow(syscall) \&lt;br /&gt;
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW)&lt;br /&gt;
&lt;br /&gt;
struct sock_filter filter[] = {&lt;br /&gt;
    /* validate arch */&lt;br /&gt;
    BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField),&lt;br /&gt;
    BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0),&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP),&lt;br /&gt;
&lt;br /&gt;
    /* load syscall */&lt;br /&gt;
    BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)),&lt;br /&gt;
&lt;br /&gt;
    /* list of allowed syscalls */&lt;br /&gt;
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_brk, 0, 1),&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),&lt;br /&gt;
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_mmap, 0, 1),&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),&lt;br /&gt;
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_munmap, 0, 1),&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),&lt;br /&gt;
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_write, 0, 1),&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),&lt;br /&gt;
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_exit, 0, 1),&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),&lt;br /&gt;
&lt;br /&gt;
    /* and if we don&amp;#039;t match above, die */&lt;br /&gt;
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL),&lt;br /&gt;
};&lt;br /&gt;
struct sock_fprog filterprog = {&lt;br /&gt;
    .len = sizeof(filter)/sizeof(filter[0]),&lt;br /&gt;
    .filter = filter&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv) {&lt;br /&gt;
    char buf[1024];&lt;br /&gt;
&lt;br /&gt;
    /* set up the restricted environment */&lt;br /&gt;
    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {&lt;br /&gt;
        perror(&amp;quot;Could not start seccomp:&amp;quot;);&lt;br /&gt;
        exit(1);&lt;br /&gt;
    }&lt;br /&gt;
    if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &amp;amp;filterprog) == -1) {&lt;br /&gt;
        perror(&amp;quot;Could not start seccomp:&amp;quot;);&lt;br /&gt;
        exit(1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* printf only writes to stdout, but for some reason it stats it. */&lt;br /&gt;
    printf(&amp;quot;hello there!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (argc &amp;gt; 1 &amp;amp;&amp;amp; strcmp(argv[1], &amp;quot;haxor&amp;quot;) == 0) {&lt;br /&gt;
        int fd = socket(AF_INET6, SOCK_STREAM, 0);&lt;br /&gt;
        /* ...and start sending spam */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Gamajun</name></author>
	</entry>
</feed>