Public bug reported:

With Ubuntu 25.04, on arm64 hardware with BTI (e.g. Snapdragon X Elite), 
packages
using webkit (e.g. Yelp, Epiphany, jsc from libjavascriptcoregtk-bin) crash with
SIGILL, because of an indirect branch to a function without a BTI landing pad.

Epiphany for example continually prints:

(epiphany:49469): epiphany-WARNING **: 16:29:50.082: Web process crashed

As a simpler example, `jsc -e 0` will crash with Illegal instruction
(core dumped).

There is an upstream bug, but fixing this "is not something Apple plans
to implement":

https://bugs.webkit.org/show_bug.cgi?id=245697

The crash occurs in Plucky but not Oracular, since in Oracular the library
doesn't have BTI enabled:

ubuntu@plucky:~$ readelf -n 
/lib/aarch64-linux-gnu/libjavascriptcoregtk-4.1.so.0 | grep AArch64
      Properties: AArch64 feature: BTI, PAC

ubuntu@oracular:~$ readelf -n 
/lib/aarch64-linux-gnu/libjavascriptcoregtk-4.1.so.0 | grep AArch64
[nothing]

It also won't occur on hardware without BTI support.

The Debian package in sid doesn't have BTI, but there's nothing explicitly 
disabling it there,
so I'm not entirely sure why only Ubuntu is currently affected.

The crash occurs when trying to call llint_program_prologue, which is defined 
in assembly.
Normally assembly files without the correct annotation will not set the BTI 
feature, but for
JavaScriptCore, LowLevelInterpreter.cpp includes the functions from 
LowLevelInterpreter.asm
as inline assembly, so the toolchain doesn't recognise that there is a problem; 
it has no way
of knowing that the labels inside the asm block will be used as indirect branch 
targets.

The fix for this (to avoid extensive source changes) will be to recompile the 
package to not use
BTI, for example by using -mbranch-protection=pac-ret rather than 
-mbranch-protection=standard .

I think a simpler fix is just to change hardening=+all in

export DEB_BUILD_MAINT_OPTIONS = hardening=+all optimize=-lto

in debian/rules to hardening=+all,-branch , but that will also disable
PAC.

A systemwide workaround is to add arm64.nobti to the kernel command
line.

** Affects: webkit2gtk (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Desktop
Packages, which is subscribed to webkit2gtk in Ubuntu.
https://bugs.launchpad.net/bugs/2107619

Title:
  JSC crashes with SIGILL on arm64 hardware with BTI

Status in webkit2gtk package in Ubuntu:
  New

Bug description:
  With Ubuntu 25.04, on arm64 hardware with BTI (e.g. Snapdragon X Elite), 
packages
  using webkit (e.g. Yelp, Epiphany, jsc from libjavascriptcoregtk-bin) crash 
with
  SIGILL, because of an indirect branch to a function without a BTI landing pad.

  Epiphany for example continually prints:

  (epiphany:49469): epiphany-WARNING **: 16:29:50.082: Web process
  crashed

  As a simpler example, `jsc -e 0` will crash with Illegal instruction
  (core dumped).

  There is an upstream bug, but fixing this "is not something Apple
  plans to implement":

  https://bugs.webkit.org/show_bug.cgi?id=245697

  The crash occurs in Plucky but not Oracular, since in Oracular the library
  doesn't have BTI enabled:

  ubuntu@plucky:~$ readelf -n 
/lib/aarch64-linux-gnu/libjavascriptcoregtk-4.1.so.0 | grep AArch64
        Properties: AArch64 feature: BTI, PAC

  ubuntu@oracular:~$ readelf -n 
/lib/aarch64-linux-gnu/libjavascriptcoregtk-4.1.so.0 | grep AArch64
  [nothing]

  It also won't occur on hardware without BTI support.

  The Debian package in sid doesn't have BTI, but there's nothing explicitly 
disabling it there,
  so I'm not entirely sure why only Ubuntu is currently affected.

  The crash occurs when trying to call llint_program_prologue, which is defined 
in assembly.
  Normally assembly files without the correct annotation will not set the BTI 
feature, but for
  JavaScriptCore, LowLevelInterpreter.cpp includes the functions from 
LowLevelInterpreter.asm
  as inline assembly, so the toolchain doesn't recognise that there is a 
problem; it has no way
  of knowing that the labels inside the asm block will be used as indirect 
branch targets.

  The fix for this (to avoid extensive source changes) will be to recompile the 
package to not use
  BTI, for example by using -mbranch-protection=pac-ret rather than 
-mbranch-protection=standard .

  I think a simpler fix is just to change hardening=+all in

  export DEB_BUILD_MAINT_OPTIONS = hardening=+all optimize=-lto

  in debian/rules to hardening=+all,-branch , but that will also disable
  PAC.

  A systemwide workaround is to add arm64.nobti to the kernel command
  line.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/webkit2gtk/+bug/2107619/+subscriptions


-- 
Mailing list: https://launchpad.net/~desktop-packages
Post to     : desktop-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~desktop-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to