Chromium crasht op SECCOMP FILTER sandboxing

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Hoi jongens & meisjes :w

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 <3.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.. :P Kortom, élke tab crasht, zelfs about:blank en zelfs chrome://settings/! 8)7

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 :X

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.. :P Laten we dan even verder kijken wanneer IsEventFd() aangeroepen wordt..

[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 :P

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! :P

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?

Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 30-09 08:10
Heb je al geprobeerd een fatsoenlijke stacktrace te krijgen met gdb? Lijkt me handig. Strace output lijkt me een nog aardiger begin.

Also, heeft je kernel uberhaupt CONFIG_EVENTFD?