parallaxsecond / parallaxsecond/rust-cryptoki

Segmentation faults on RISC-V in `pthread_create` for modules other than SoftHSM

Open
#314 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
115
Forks
96
Avg merge
22h 56m
Merged PRs (30d)
2

Description

We are using cryptoki on RISC-V and encounter segmentation faults when using any pkcs11 module other than SoftHSM (which does work and passes all tests).

For our own investigation, we created this short example:

use std::env;

use cryptoki::context::{CInitializeArgs, Pkcs11};

fn main() {
    let args: Vec<String> = env::args().collect();
    let pkcs11 = Pkcs11::new(args.get(1).unwrap()).expect("failed to load pkcs11 module");
    println!("Module loaded");
    pkcs11
        .initialize(CInitializeArgs::OsThreads)
        .expect("failed to initialize pkcs11");
    println!("PKCS11 initialized");
    let slot = pkcs11.get_slots_with_token().expect("could not get slot")[0];
    println!("slot chosen");
    let session = pkcs11.open_ro_session(slot).unwrap();
    println!("Here are some random bytes: {:?}", session.generate_random_vec(8));
}

When using OpenSCs module opensc-pkcs11.so, we get the following backtrace with gdb, indicating a failure at Pkcs11::new(...):

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7809502 in pthread_create () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff7809502 in pthread_create () from /usr/lib/libc.so.6
#1  0x00007ffff742c4cc in ?? () from /usr/lib/libglib-2.0.so.0
#2  0x00007ffff742d6e2 in g_thread_pool_new_full () from /usr/lib/libglib-2.0.so.0
#3  0x00007ffff7617d68 in ?? () from /usr/lib/libgio-2.0.so.0
#4  0x00007ffff7617eba in g_task_get_type () from /usr/lib/libgio-2.0.so.0
#5  0x00007ffff7687b1a in ?? () from /usr/lib/libgio-2.0.so.0
#6  0x00007ffff7679ff8 in g_bus_get_sync () from /usr/lib/libgio-2.0.so.0
#7  0x00007ffff764b20c in g_application_register () from /usr/lib/libgio-2.0.so.0
#8  0x00007ffff7fc6702 in ?? () from /usr/lib/opensc-pkcs11.so
#9  0x000000000008f8ce in call_init ()
#10 0x000000000008f99a in _dl_init ()
#11 0x00000000000729e0 in _dl_catch_exception ()
#12 0x0000000000073bca in dl_open_worker ()
#13 0x00000000000729bc in _dl_catch_exception ()
#14 0x0000000000073e40 in _dl_open ()
#15 0x0000000000067102 in dlopen_doit ()
#16 0x00000000000729bc in _dl_catch_exception ()
#17 0x0000000000072a0e in _dl_catch_error ()
#18 0x0000000000066fce in _dlerror_run ()
#19 0x000000000006717c in dlopen ()
#20 0x000000000001c06a in libloading::os::unix::{impl#2}::open::{closure#0}<&std::path::Path> () at /home/lukas/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libloading-0.8.9/src/os/unix/mod.rs:190
#21 0x000000000001be64 in libloading::os::unix::with_dlerror<libloading::os::unix::Library, libloading::os::unix::{impl#2}::open::{closure_env#0}<&std::path::Path>, libloading::error::Error> (closure=<error reading variable: Cannot access memory at address 0x1000>, error=0x1b8e8 <core::ops::function::FnOnce::call_once<libloading::os::unix::{impl#2}::open::{closure_env#1}<&std::path::Path>, (&core::ffi::c_str::CStr)>>)
    at /home/lukas/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libloading-0.8.9/src/os/unix/mod.rs:69
#22 0x000000000001bf50 in libloading::os::unix::Library::open<&std::path::Path> (filename=..., flags=1) at /home/lukas/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libloading-0.8.9/src/os/unix/mod.rs:188
#23 0x000000000001bef4 in libloading::os::unix::Library::new<&std::path::Path> (filename=...) at /home/lukas/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libloading-0.8.9/src/os/unix/mod.rs:135
#24 0x000000000001c2d4 in libloading::safe::Library::new<&std::path::Path> (filename=...) at /home/lukas/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libloading-0.8.9/src/safe.rs:85
#25 0x000000000001b74a in cryptoki_sys::Pkcs11::new<&std::path::Path> (path=...) at /home/lukas/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cryptoki-sys-0.4.0/src/bindings/riscv64gc-unknown-linux-gnu.rs:5941
#26 0x000000000001bd16 in cryptoki::context::Pkcs11::new<&alloc::string::String> (filename=0x122fc8) at /home/lukas/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cryptoki-0.10.0/src/context/mod.rs:118
#27 0x0000000000017616 in pkcs11_test::main () at src/main.rs:7

For another HSM, the Thales SafeNet eToken, using even another module, we get a similar error, however a bit later, during pkcs11.initialize(...):

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff75fa502 in pthread_create () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff75fa502 in pthread_create () from /usr/lib/libc.so.6
#1  0x00007ffff7f83bb8 in C_Initialize () from ./safenet/this/outLinux/debug32/libeToken.so
#2  0x0000000000025bfc in cryptoki::context::general_purpose::initialize (ctx=0x7ffffffff530) at src/context/general_purpose.rs:19
#3  cryptoki::context::Pkcs11::initialize (self=0x7ffffffff530) at src/context/mod.rs:195
#4  0x000000000001768e in pkcs11_test::main () at src/main.rs:10

Both those modules do work on x86 with the same example, and also with the pkcs11-tool on RISC-V.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the reproducer in src/main.rs and trace Pkcs11::new through context/mod.rs, then initialization through context/general_purpose.rs and the RISC-V bindings in cryptoki-sys. Reproduce with the OpenSC and SafeNet modules, compare their failures with SoftHSM, and consider the issue done when module loading and initialization no longer segfault on RISC-V.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
security
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.