Hoi jongens & meisjes 
Laatst dacht ik, gut, laat ik eens m'n Chromium updaten, want die liep alweer een paar versies achter.
Ik draai Gentoo GNU/Linux, dus ik zorgde ervoor dat m'n Portage-repository uptodate was en startte het emerge-proces:
De SECCOMP_FILTER-waarschuwing viel mij op, dús meteen maar eventjes m'n kernel geupgrade met SECCOMP_FILTER aan natuurlijk. (Gaat volgens mij standaard, ik kan hem niet vinden in `make menuconfig` in de recentste kernel, maar m'n
.5-kernel had überhaupt geen SECCOMP_FILTER, dus daar viel Chromium natuurlijk over.
Vervolgens probleemloos gecompiled en gemerged..
Maar helaas, Chromium geeft een crash-scherm zodra ik hem opstart: de bekende "Aw, Snap!" met "Something went wrong while displaying this webpage. To continue, reload or go to another page."
Nou ja, needless to say dat een andere pagina geen nut had, daar mijn default scherm Chromium's eigen home-screen is..
Kortom, élke tab crasht, zelfs about:blank en zelfs chrome://settings/! 
Als we Chromium opstarten via een Terminal, dan zien we het volgende:
Euh, okéé, "**CRASHING**:seccomp-bpf failure in syscall 0290", dus heeft iets met dat SECCOMP_FILTER te maken, fijn!
Wat is syscall 290 dan? Volgens een pagina genaamd Searchable Linux Syscall Table for x86 and x86_64 is dat `eventfd2`.. Dus dat vindt Chromium niet zo lief blijkbaar.. Wat raar is, want hij roept 'em zelf aan lijkt me..?
Het ligt ook echt aan de SECCOMP_FILTER, aangezien Chromium prima draait via:
Zie je natuurlijk wel een waarschuwing in Chromium's venster dat 't onveilig is blabla.. En da's ook zo natuurlijk, relatief t.o.v. wél een SECCOMP filtering sandbox.
Maargoed, wáár ligt het dan precies aan? Wát gaat de fout in?
Nu vond ik een enorme lijst met command line flags voor Chromium, dús:
Je ziet dat --disable-seccomp-filter-sandbox weggelaten is: met die flag werkt 'ie immers wel.
Helaas...
Zelfs met 197 `disable`-flags blijft 'ie crashen
Het ligt dus niet aan plugins of extensions (die zijn immers ook disabled)?
Terug naar de syscall 0290, ofwel `eventfd2`.. Waar komen we die allemaal tegen in de `Chromium` source?
(Linkje naar onderkant post om al het C++-code-geneuzel over te slaan.. Komt wat mij betreft ook niets uit, maar ik ben geen code-guru..)
Hmmkay, interessant: components/nacl/loader/nonsfi/nonsfi_sandbox_sigsys_unittest.cc
Euh, okee, hij test dus wat syscalls die errors zouden moeten geven.. Maar ik denk niet dat 't door dit stukje code komt, omdat 'ie anders wel eerder een error zou geven op een andere, eerder genoemde syscall.
De 2e file dan: sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
Euh, okéé, die returnt dus true of false, afhankelijk van wat er als argument gegeven is.. Ik zie 't nut nog niet echt, laat staan waarom 'ie hierop crasht..
De volgende files zijn slechts definities van de syscall gekoppeld aan een naampje.. Maar we wisten al dat 290 eventfd2 was..
Laten we dan even verder kijken wanneer IsEventFd() aangeroepen wordt..
Relevant stukje uit content/common/sandbox_linux/bpf_gpu_policy_linux.cc:
Hmkay, heeft dus iets te maken met de GPU policy. En hier zeggen ze juist Allow() als `sysno` een EventFd-syscall is.. Weird..
2e file dan: sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc:
Huh? Hier zeggen ze weer dat EventFd een crash triggert? Ik snap d'r geen biet meer van
Stukje lager wordt IsBaselinePolicyWatched() aangeroepen:
En bijna helemaal onderaan wordt EvaluateSyscallImpl() aangeroepen:
Die wordt in allerlei andere files aangeroepen en onderscheid niet echt in eventfd2 of een andere syscall natuurlijk..
Nou, dát was nuttig!
Ondertussen snap ik d'r geen biet meer van en helpt 't verderduiken de source in me niet echt heb ik 't idee..
Uiteraard heb ik ook andere versies (testing) van Chromium gecompiled.. 40.0.2214.10 installeren heeft geen nut helaas en de 41-versies zijn hard-masked, dus die heb ik niet geprobeerd..
Iemand énig idee hoe je dit kunt oplossen en waar ik verder zou moeten zoeken?

Laatst dacht ik, gut, laat ik eens m'n Chromium updaten, want die liep alweer een paar versies achter.
Ik draai Gentoo GNU/Linux, dus ik zorgde ervoor dat m'n Portage-repository uptodate was en startte het emerge-proces:
[b][red]desktop[/][blue] ~ #[/][/] emerge --sync [b][red]desktop[/][blue] ~ #[/][/] emerge -v chromium [green]These are the packages that would be merged, in order:[/] Calculating dependencies... done! [[b][green]ebuild[/] U[/] ] [b][green]www-client/chromium-39.0.2171.65[/] [blue][35.0.1916.153][/][/] USE="([b][red]pic[/][/]) [b][red]tcmalloc[/] [blue]-bindist -cups -custom-cflags -gnome -gnome-keyring -kerberos [/][/]([b][blue]-neon[/][/]) [b][blue]-pulseaudio[/][/] ([b][blue]-selinux[/][/]) {[b][blue]-test[/][/]}" LINGUAS="[b][red]en_GB uk[/] [blue]-am -ar -bg -bn -ca -cs -da -de -el -es -es_LA -et -fa -fi -fil -fr -gu -he -hi -hr -hu -id -it -ja -kn -ko -lt -lv -ml -mr -ms -nb -nl -pl -pt_BR -pt_PT -ro -ru -sk -sl -sr -sv -sw -ta -te -th -tr -vi -zh_CN -zh_TW[/][/]" 0 KiB Total: 1 package (1 upgrade), Size of downloads: 0 KiB >>> Verifying ebuild manifests >>> Emerging ([b]1[/] of [b]1[/]) [green]www-client/chromium-39.0.2171.65::gentoo[/] * chromium-39.0.2171.65-lite.tar.xz SHA256 SHA512 WHIRLPOOL size ;-) ... [b][blue][[/] [green]ok[/] [blue]][/][/] [b][green]*[/][/] Determining the location of the kernel source code [b][green]*[/][/] Found kernel source directory: [b][green]*[/][/] /usr/src/linux [b][green]*[/][/] Found kernel object directory: [b][green]*[/][/] /lib/modules/3.4.9-gentoo/build [b][green]*[/][/] Found sources for kernel version: [b][green]*[/][/] 3.4.9-gentoo [b][green]*[/][/] Checking for suitable kernel configuration options... [b][green]*[/][/] SECCOMP_FILTER is required for sandbox to work [b][green]*[/][/] Please check to make sure these options are set correctly. [b][green]*[/][/] Failure to do so may cause unexpected problems. [b][green]*[/][/] bindist disabled: Resulting binaries may not be legal to re-distribute. >>> Unpacking source...
De SECCOMP_FILTER-waarschuwing viel mij op, dús meteen maar eventjes m'n kernel geupgrade met SECCOMP_FILTER aan natuurlijk. (Gaat volgens mij standaard, ik kan hem niet vinden in `make menuconfig` in de recentste kernel, maar m'n

Vervolgens probleemloos gecompiled en gemerged..
Maar helaas, Chromium geeft een crash-scherm zodra ik hem opstart: de bekende "Aw, Snap!" met "Something went wrong while displaying this webpage. To continue, reload or go to another page."
Nou ja, needless to say dat een andere pagina geen nut had, daar mijn default scherm Chromium's eigen home-screen is..

Als we Chromium opstarten via een Terminal, dan zien we het volgende:
[b][green]user@desktop[/][blue] ~ $[/][/] chromium ../../sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc:**CRASHING**:seccomp-bpf failure in syscall 0290 ../../sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc:**CRASHING**:seccomp-bpf failure in syscall 0290
Euh, okéé, "**CRASHING**:seccomp-bpf failure in syscall 0290", dus heeft iets met dat SECCOMP_FILTER te maken, fijn!
Wat is syscall 290 dan? Volgens een pagina genaamd Searchable Linux Syscall Table for x86 and x86_64 is dat `eventfd2`.. Dus dat vindt Chromium niet zo lief blijkbaar.. Wat raar is, want hij roept 'em zelf aan lijkt me..?
Het ligt ook echt aan de SECCOMP_FILTER, aangezien Chromium prima draait via:
[b][green]user@desktop[/][blue] ~ #[/][/] chromium --disable-seccomp-filter-sandbox
Zie je natuurlijk wel een waarschuwing in Chromium's venster dat 't onveilig is blabla.. En da's ook zo natuurlijk, relatief t.o.v. wél een SECCOMP filtering sandbox.
Maargoed, wáár ligt het dan precies aan? Wát gaat de fout in?
Nu vond ik een enorme lijst met command line flags voor Chromium, dús:
[b][green]user@desktop[/][blue] ~ #[/][/] chromium --disable-gpu-compositing --disable-gpu-driver-bug-workarounds --disable-gpu-program-cache --disable-gpu-rasterization --disable-gpu-sandbox --disable-gpu-shader-disk-cache --disable-gpu-vsync --disable-gpu-watchdog --disable-hang-monitor --disable-harfbuzz-rendertext --disable-hid-detection-on-oobe --disable-histogram-customizer --disable-impl-side-painting --disable-infobar-for-protected-media-identifier --disable-infobars --disable-input-view --disable-ipv4 --disable-ipv6 --disable-java --disable-javascript --disable-javascript-harmony-shipping --disable-kill-after-bad-ipc --disable-lcd-text --disable-legacy-window --disable-local-storage --disable-logging --disable-login-animations --disable-login-scroll-into-view --disable-low-res-tiling --disable-main-frame-before-activation --disable-manager-for-sync-signin --disable-media-source --disable-method-check --disable-minimize-on-second-launcher-item-click --disable-network-portal-notification --disable-new-avatar-menu --disable-new-bookmark-apps --disable-new-channel-switcher-ui --disable-new-kiosk-ui --disable-new-profile-management --disable-new-zip-unpacker --disable-ntp-other-sessions-menu --disable-office-editing-component-extension --disable-offline-auto-reload --disable-offline-auto-reload-visible-only --disable-offline-load-stale-cache --disable-one-copy --disable-origin-chip --disable-out-of-process-pdf --disable-overlay-scrollbar --disable-overscroll-edge-effect --disable-panel-fitting --disable-password-generation --disable-password-link --disable-password-manager-reauthentication --disable-people-search --disable-pepper-3d --disable-permissions-bubbles --disable-pinch --disable-pinch-virtual-viewport --disable-plugins --disable-plugins-discovery --disable-pnacl-crash-throttling --disable-policy-key-verification --disable-popup-blocking --disable-preconnect --disable-prefer-compositing-to-lcd-text --disable-prefixed-encrypted-media --disable-prerender-local-predictor --disable-print-preview --disable-prompt-on-repost --disable-pull-to-refresh-effect --disable-quic --disable-quic-pacing --disable-quic-port-selection --disable-remote-core-animation --disable-remote-fonts --disable-renderer-accessibility --disable-rollback-option --disable-save-password-bubble --disable-search-button-in-omnibox --disable-session-crashed-bubble --disable-session-storage --disable-settings-window --disable-setuid-sandbox --disable-shader-name-hashing --disable-shared-workers --disable-signin-scoped-device-id --disable-single-click-autofill --disable-single-thread-proxy-scheduler --disable-smooth-scrolling --disable-software-rasterizer --disable-spdy-proxy-dev-auth-origin --disable-suggestions-service --disable-supervised-user-blacklist --disable-supervised-user-safesites --disable-surfaces --disable-svg1dom --disable-sync --disable-sync-app-list --disable-sync-backup --disable-sync-rollback --disable-sync-types --disable-system-fullscreen-for-testing --disable-text-blobs --disable-text-input-focus-manager --disable-threaded-animation --disable-threaded-compositing --disable-threaded-scrolling --disable-touch-adjustment --disable-touch-drag-drop --disable-touch-editing --disable-touch-feedback --disable-translate --disable-v8-idle-notification-after-commit --disable-vaapi-accelerated-video-encode --disable-views-rect-based-targeting --disable-virtual-keyboard-overscroll --disable-volume-adjust-sound --disable-web-resources --disable-web-security --disable-webaudio --disable-webgl --disable-webrtc --disable-webrtc-encryption --disable-webrtc-hw-decoding --disable-webrtc-hw-encoding --disable-win32k-renderer-lockdown --disable-x-token --disable-xslt --disable-xss-auditor --disable-zero-browsers-open-for-tests --disable-zero-suggest
Je ziet dat --disable-seccomp-filter-sandbox weggelaten is: met die flag werkt 'ie immers wel.
Helaas...
Zelfs met 197 `disable`-flags blijft 'ie crashen

Het ligt dus niet aan plugins of extensions (die zijn immers ook disabled)?
Terug naar de syscall 0290, ofwel `eventfd2`.. Waar komen we die allemaal tegen in de `Chromium` source?
(Linkje naar onderkant post om al het C++-code-geneuzel over te slaan.. Komt wat mij betreft ook niets uit, maar ik ben geen code-guru..)
[b][red]desktop[/][blue] chromium-39.0.2171.65 #[/][/] grep -Ri eventfd * components/nacl/loader/nonsfi/nonsfi_sandbox_sigsys_unittest.cc:RESTRICT_SYSCALL_DEATH_TEST([b][red]eventfd2[/][/]); sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc: case __NR_[b][red]eventfd2[/][/]: sandbox/linux/services/x86_64_linux_syscalls.h:#if !defined(__NR_[b][red]eventfd2[/][/]) sandbox/linux/services/x86_64_linux_syscalls.h:#define __NR_[b][red]eventfd2[/][/] 290 sandbox/linux/services/mips_linux_syscalls.h:#if !defined(__NR_[b][red]eventfd2[/][/]) sandbox/linux/services/mips_linux_syscalls.h:#define __NR_[b][red]eventfd2[/][/] (__NR_Linux + 325) sandbox/linux/services/arm64_linux_syscalls.h:#if !defined(__NR_[b][red]eventfd2[/][/]) sandbox/linux/services/arm64_linux_syscalls.h:#define __NR_[b][red]eventfd2[/][/] 19 sandbox/linux/services/arm_linux_syscalls.h:#if !defined(__NR_[b][red]eventfd2[/][/]) sandbox/linux/services/arm_linux_syscalls.h:#define __NR_[b][red]eventfd2[/][/] (__NR_SYSCALL_BASE+356) sandbox/linux/services/x86_32_linux_syscalls.h:#if !defined(__NR_[b][red]eventfd2[/][/]) sandbox/linux/services/x86_32_linux_syscalls.h:#define __NR_[b][red]eventfd2[/][/] 328 [heleboel kapotte symlink-errors] [b][red]desktop[/][blue] chromium-39.0.2171.65 #[/][/]
Hmmkay, interessant: components/nacl/loader/nonsfi/nonsfi_sandbox_sigsys_unittest.cc
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| // Test cases in this file just make sure not-whitelisted syscalls // are appropriately disallowed. They should raise SIGSYS regardless // of arguments. We always pass five zeros not to pass uninitialized // values to syscalls. #define RESTRICT_SYSCALL_DEATH_TEST_IMPL(name, sysno) \ BPF_DEATH_TEST_C(NaClNonSfiSandboxSIGSYSTest, \ name, \ DEATH_MESSAGE(sandbox::GetErrorMessageContentForTests()), \ nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) { \ syscall(sysno, 0, 0, 0, 0, 0, 0); \ } #define RESTRICT_SYSCALL_DEATH_TEST(name) \ RESTRICT_SYSCALL_DEATH_TEST_IMPL(name, __NR_ ## name) [knip] RESTRICT_SYSCALL_DEATH_TEST(epoll_ctl); #if defined(__x86_64__) RESTRICT_SYSCALL_DEATH_TEST(epoll_ctl_old); #endif RESTRICT_SYSCALL_DEATH_TEST(epoll_pwait); RESTRICT_SYSCALL_DEATH_TEST(epoll_wait); #if defined(__x86_64__) RESTRICT_SYSCALL_DEATH_TEST(epoll_wait_old); #endif RESTRICT_SYSCALL_DEATH_TEST(eventfd); RESTRICT_SYSCALL_DEATH_TEST(eventfd2); RESTRICT_SYSCALL_DEATH_TEST(execve); RESTRICT_SYSCALL_DEATH_TEST(faccessat); #if defined(__i386__) || defined(__x86_64__) RESTRICT_SYSCALL_DEATH_TEST(fadvise64); [knip] |
Euh, okee, hij test dus wat syscalls die errors zouden moeten geven.. Maar ik denk niet dat 't door dit stukje code komt, omdat 'ie anders wel eerder een error zou geven op een andere, eerder genoemde syscall.
De 2e file dan: sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| // The functions below cover all existing i386, x86_64, and ARM system calls; // excluding syscalls made obsolete in ARM EABI. // The implicitly defined sets form a partition of the sets of // system calls. [knip] bool SyscallSets::IsEventFd(int sysno) { switch (sysno) { #if !defined(__aarch64__) case __NR_eventfd: #endif case __NR_eventfd2: return true; default: return false; } } [knip] |
Euh, okéé, die returnt dus true of false, afhankelijk van wat er als argument gegeven is.. Ik zie 't nut nog niet echt, laat staan waarom 'ie hierop crasht..
De volgende files zijn slechts definities van de syscall gekoppeld aan een naampje.. Maar we wisten al dat 290 eventfd2 was..
[b][red]desktop[/][blue] chromium-39.0.2171.65 #[/][/] grep -Ri IsEventFd * content/common/sandbox_linux/bpf_gpu_policy_linux.cc: if (SyscallSets::IsEventFd(sysno)) sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc: SyscallSets::IsEventFd(sysno) || sandbox/linux/seccomp-bpf-helpers/syscall_sets.h: static bool IsEventFd(int sysno); sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc:bool SyscallSets::IsEventFd(int sysno) { [knip symlinks die kapot zijn] [b][red]desktop[/][blue] chromium-39.0.2171.65 #[/][/]
Relevant stukje uit content/common/sandbox_linux/bpf_gpu_policy_linux.cc:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| // Main policy for x86_64/i386. Extended by CrosArmGpuProcessPolicy. ResultExpr GpuProcessPolicy::EvaluateSyscall(int sysno) const { switch (sysno) { case __NR_ioctl: #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) // The Nvidia driver uses flags not in the baseline policy // (MAP_LOCKED | MAP_EXECUTABLE | MAP_32BIT) case __NR_mmap: #endif // We also hit this on the linux_chromeos bot but don't yet know what // weird flags were involved. case __NR_mprotect: // TODO(jln): restrict prctl. case __NR_prctl: case __NR_sched_getaffinity: case __NR_sched_setaffinity: case __NR_setpriority: return Allow(); case __NR_access: case __NR_open: case __NR_openat: DCHECK(broker_process_); return Trap(GpuSIGSYS_Handler, broker_process_); default: if (SyscallSets::IsEventFd(sysno)) return Allow(); // Default on the baseline policy. return SandboxBPFBasePolicy::EvaluateSyscall(sysno); } } |
Hmkay, heeft dus iets te maken met de GPU policy. En hier zeggen ze juist Allow() als `sysno` een EventFd-syscall is.. Weird..
2e file dan: sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| // System calls that will trigger the crashing SIGSYS handler. bool IsBaselinePolicyWatched(int sysno) { return SyscallSets::IsAdminOperation(sysno) || SyscallSets::IsAdvancedScheduler(sysno) || SyscallSets::IsAdvancedTimer(sysno) || SyscallSets::IsAsyncIo(sysno) || SyscallSets::IsDebug(sysno) || SyscallSets::IsEventFd(sysno) || SyscallSets::IsExtendedAttributes(sysno) || SyscallSets::IsFaNotify(sysno) || SyscallSets::IsFsControl(sysno) || SyscallSets::IsGlobalFSViewChange(sysno) || SyscallSets::IsGlobalProcessEnvironment(sysno) || SyscallSets::IsGlobalSystemStatus(sysno) || SyscallSets::IsInotify(sysno) || SyscallSets::IsKernelModule(sysno) || SyscallSets::IsKeyManagement(sysno) || SyscallSets::IsKill(sysno) || SyscallSets::IsMessageQueue(sysno) || SyscallSets::IsMisc(sysno) || #if defined(__x86_64__) SyscallSets::IsNetworkSocketInformation(sysno) || #endif SyscallSets::IsNuma(sysno) || SyscallSets::IsPrctl(sysno) || SyscallSets::IsProcessGroupOrSession(sysno) || #if defined(__i386__) || defined(__mips__) SyscallSets::IsSocketCall(sysno) || #endif #if defined(__arm__) SyscallSets::IsArmPciConfig(sysno) || #endif #if defined(__mips__) SyscallSets::IsMipsMisc(sysno) || #endif SyscallSets::IsTimer(sysno); } |
Huh? Hier zeggen ze weer dat EventFd een crash triggert? Ik snap d'r geen biet meer van
Stukje lager wordt IsBaselinePolicyWatched() aangeroepen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| // |fs_denied_errno| is the errno return for denied filesystem access. ResultExpr EvaluateSyscallImpl(int fs_denied_errno, pid_t current_pid, int sysno) { if (IsBaselinePolicyAllowed(sysno)) { return Allow(); } [knip van wat losse syscall-checks al dan niet afhankelijk van platform (geen eventfd)] if (SyscallSets::IsFileSystem(sysno) || SyscallSets::IsCurrentDirectory(sysno)) { return Error(fs_denied_errno); } [sandboxed zooi mag blijkbaar geen toegang tot je FS.. Wel zo veilig / knip] if (IsBaselinePolicyWatched(sysno)) { // Previously unseen syscalls. TODO(jln): some of these should // be denied gracefully right away. return CrashSIGSYS(); } // In any other case crash the program with our SIGSYS handler. return CrashSIGSYS(); } |
En bijna helemaal onderaan wordt EvaluateSyscallImpl() aangeroepen:
C++:
1
2
3
4
5
6
7
8
9
| ResultExpr BaselinePolicy::EvaluateSyscall(int sysno) const { // Sanity check that we're only called with valid syscall numbers. DCHECK(SandboxBPF::IsValidSyscallNumber(sysno)); // Make sure that this policy is used in the creating process. if (1 == sysno) { DCHECK_EQ(syscall(__NR_getpid), current_pid_); } return EvaluateSyscallImpl(fs_denied_errno_, current_pid_, sysno); } |
Die wordt in allerlei andere files aangeroepen en onderscheid niet echt in eventfd2 of een andere syscall natuurlijk..
Nou, dát was nuttig!
Ondertussen snap ik d'r geen biet meer van en helpt 't verderduiken de source in me niet echt heb ik 't idee..
Uiteraard heb ik ook andere versies (testing) van Chromium gecompiled.. 40.0.2214.10 installeren heeft geen nut helaas en de 41-versies zijn hard-masked, dus die heb ik niet geprobeerd..
Iemand énig idee hoe je dit kunt oplossen en waar ik verder zou moeten zoeken?