Public bug reported:

[Impact]

 * libibus 1.5.33 and later store a *floating* IBusAttrList in the
   IBusText that ibus_input_context_convert_text() and
   ibus_panel_convert_text() return, whenever the preedit carries at
   least one attribute.
 * gnome-shell (HINT preedit format since GNOME 49) reads it with
   text.get_attributes(). GJS ref_sinks the incoming object, so the
   IBusText and the JS wrapper share a single reference. When the
   IBusText is destroyed after the signal, the list is freed under a
   live wrapper.
 * Every such preedit logs, at the next GJS collection:
     g_object_unref: assertion 'G_IS_OBJECT (object)' failed
     Object 0x... of type IBusAttrList has been finalized while it was
     still owned by gjs, this is due to invalid memory management.
   and eventually gnome-shell segfaults. On Wayland that ends the whole
   user session, with unsaved work lost.
 * On GNOME Wayland gnome-shell is the IBus client of every application,
   so every IME that styles its preedit is affected: anthy, mozc, rime,
   libpinyin, hangul, and dictation engines that send semantic hints.
   Commit-only input sends an empty list, which takes a safe path.
 * Fix: upstream 5bbe88a1 (sink the list via ibus_text_set_attributes)
   and its follow-up 1a331e69 (fixes the leak 5bbe88a1 introduced for
   empty lists). Both are in 1.5.35-rc1, which Debian unstable already
   carries (1.5.35~rc1-1), so the next development series gets the fix
   by sync.

[Test Plan]

 Reproducer, needs no gnome-shell and never touches the live session:
 a private ibus-daemon on its own address, a GJS engine sending
 preedits, and a GJS input context set up as gnome-shell sets up its
 own (set_client_commit_preedit(true), PreeditFormat.HINT,
 text.get_attributes() in the update-preedit-text handler).
 Attached: run.sh, repro.js.

 1. sudo apt install ibus gjs gir1.2-ibus-1.0
 2. dbus-run-session -- ./run.sh attrs
    Sends 20 preedits, each with one HINT attribute.
    Before: each of the two criticals above is logged (10 times each
    with the current package).
    After: no critical.
 3. dbus-run-session -- ./run.sh empty
    Same with an empty attribute list. Clean before and after
    (control: the safe path is unchanged).
 4. End to end, on a GNOME Wayland session: enable an IME that styles
    its preedit (e.g. ibus-anthy, Japanese), type a few words into
    gedit or the overview search, wait 20 s, then
      journalctl --user -b _COMM=gnome-shell | grep -c IBusAttrList
    Before: > 0. After: 0. gnome-shell keeps running.
 5. Regression: type and commit text, with and without preedit, through
    ibus-anthy and ibus-hangul in a GTK 3 app, a GTK 4 app and a Qt app
    under both Wayland and X11 sessions. Preedit appears, is styled,
    updates and commits as before.

[Where problems could occur]

 * The patches change who owns the attribute list of every IBusText that
   libibus converts for clients and panels, in
   ibus_input_context_convert_text() and ibus_panel_convert_text().
   Every IBus client links this code: gnome-shell, the GTK 3 and GTK 4
   IM modules, the Qt platform input context, the IBus panel and
   candidate window.
 * One reference too few would reintroduce a use-after-free in any of
   those clients: critical warnings in their logs, then crashes while
   composing text, the worst case being gnome-shell, which ends the
   session.
 * One reference too many would leak an IBusAttrList per preedit update.
   Memory of long-running clients such as gnome-shell would grow while
   the user types with an IME.
 * A wrong attribute list would show as missing or wrong preedit
   styling (underline, highlight of the selected segment) in
   applications, or in the candidate window.
 * 1a331e69 exists because 5bbe88a1 alone leaked on empty lists. Both
   are applied together here.

[Other Info]

 * Upstream: https://github.com/ibus/ibus/issues/2889 (fixed by PR
   https://github.com/ibus/ibus/pull/2890, commit 5bbe88a1) and
   https://github.com/ibus/ibus/issues/2941 (PR
   https://github.com/ibus/ibus/pull/2943, commit 1a331e69).
 * Introduced with the semantic preedit API (ae3c987f, 1.5.33).
   noble (1.5.29) is not affected.
 * Both patches are verbatim upstream and apply cleanly to resolute's
   1.5.34~rc2 and stonking's 1.5.34.
 * Versions: resolute 1.5.34~rc2-1ubuntu0.1 (first Ubuntu delta, so
   Maintainer is updated); stonking 1.5.34-1ubuntu3.1.
 * Seen in the field through Myna dictation's streaming preedit, whose
   preedit carries one WHOLE hint: https://github.com/canonical/myna/issues/18
   Reproduced there as a gnome-shell SIGSEGV on stonking, and by an
   e2e test in a GNOME stonking VM.

** Affects: ibus (Ubuntu)
     Importance: High
         Status: In Progress

** Affects: ibus (Ubuntu Resolute)
     Importance: Undecided
         Status: New

** Affects: ibus (Ubuntu Stonking)
     Importance: Undecided
         Status: New


** Tags: fixed-upstream resolute stonking

** Also affects: ibus (Ubuntu Resolute)
   Importance: Undecided
       Status: New

** Also affects: ibus (Ubuntu Stonking)
   Importance: Undecided
       Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2170983

Title:
  [SRU] ibus: IBusAttrList use-after-free crashes gnome-shell on preedit
  with attributes

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


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to