Skip to content

c_void 반환과 같은 불투명 포인터 FFI는 Java로 전달될 때 그닥 안전하지 않음 #1

@Quant-TheodoreFelix

Description

@Quant-TheodoreFelix

ff/base64_ffi.rs 의 몇 가지 함수는 다음과 같이 c언어의 void* 기반 불투명 포인터를 전달하고 있음

pub unsafe extern "C" fn entlib_b64_encode_secure(
    input_ptr: *const u8,
    input_len: usize,
    out_len: *mut usize,
) -> *mut c_void { ... }

pub unsafe extern "C" fn entlib_b64_decode_secure(
    input_ptr: *const u8,
    input_len: usize,
    out_len: *mut usize,
    err_flag: *mut u8,
) -> *mut c_void { ... }

Rust 기반의 FFI 환경에선 위 방식이 적절하지 않음을 발견함. *mut c_void를 사용하면 포인터가 가리키는 실제 데이터의 타입 정보가 소실되고, 이 이유로 인해 해제 함수인 entlib_free_secure_buffer나 데이터 접근 함수에 전혀 다른 구조체의 포인터가 전달되더라도 런타임 캐스팅을 수행하기 전까지 러스트 컴파일러가 이를 차단하지 못함.

근데 일단 그 전에 왜 base64 모듈에 보안-소거 함수가 존재하는지 의문이긴 한데, 어찌됐던 위 사항은 명명백백한 보안 취약점이라고 할 수도 있음. 해당 함수들은 SecureBuffer 구조체를 반환하도록 수정되어야 함

Metadata

Metadata

Assignees

No one assigned

    Labels

    CRITICALyo its critical bugbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions