리눅스 PPP 네트워크 코드의 BSD-Compress 폐지 제안
LINUX NETWORKING
CONFIG_PPP_BSDCOMP는 Point-To-Point Protocol 연결을 위한 BSD-Compress 데이터 압축에 사용됩니다. 현재 이는 상당 부분 레거시 아티팩트입니다. 리눅스 개발자 Qingfang Deng은 오늘 64비트 시스템에서 디코더의 누산기(accumulator) 폭과 관련된 치명적인 오류로 인해 압축되지 않은 패킷이 발생할 수 있다는 이유로 PPP 네트워킹 코드에서 BSD-Compress 지원을 제거해야 한다고 주장했습니다. 커널 내의 BSD-Compress 코드는 1990년대 이후 거의 수정된 적이 없습니다. 그 외에도, 리눅스 PPP 프로토콜과 압축기들은 리눅스 커널 내에서 고아(orphaned) 상태입니다.
"BSD-Compress 디코더는 accm이 32비트라고 가정하지만, 이를 unsigned long으로 선언합니다. 64비트 시스템에서는 소모된 코드 비트가 왼쪽 시프트(left shift)를 거치면서 다음 코드를 손상시킵니다. x86-64 PPP-over-PTY 루프백 테스트는 첫 번째 압축 패킷에서 치명적인 bad-code 오류를 재현합니다."
pppd는 일반적으로 두 가지 방법 모두 협상 가능한 경우 BSD-Compress보다 Deflate를 우선적으로 요청합니다. 만약 BSD-Compress가 선택되었고 이 치명적인 오류에 직면하면, pppd는 압축을 비활성화하고 다음 메시지를 기록합니다:
Lost compression sync: disabling compression
링크는 유지되며 트래픽은 압축되지 않은 상태로 계속될 수 있습니다.
핵심 압축 루틴은 Linux 2.1.67 (1997년) 이후 변경된 적이 없으며, 압축 해제 루틴은 Linux 1.3.33 (1995년)에 도입된 이래로 변경되지 않았습니다. 이후의 변경 사항들은 모듈 통합 및 수명 처리, 커널 API, 할당 강화(allocation hardening), 메타데이터 및 코드 구성 등을 업데이트했지만, 디코더의 누산기 폭을 수정하지는 못했습니다.
관련 문제는 2024년에 보고되었는데, 검토 과정에서 unsigned int를 사용하는 것이 제안되었습니다. 하지만 디코더는 여전히 unsigned long을 사용하고 있습니다. PPP 프로토콜 드라이버와 압축기들은 고아 상태입니다."
제거 패치는 netdev 메일링 리스트에서 검토가 대기 중입니다.