OpenSSH用パッチ OpenSSL-1.1.x化対応

OpenSSH用のパッチを公開しています

最近は OpenSSLを初めとした オープンソース系の脆弱性情報も頻繁に公開されるようになりました

OpenSSLは 0.9.x系 1.0.x系 1.1.x系 といくつかバリエーションがありますが
「OpenSSL-1.1系の最新版を使うことを推奨します」といった文句を受けて OpenSSL-1.1.0に更新したら
これが地雷だったようで 1.1.0になっていくつか APIの仕様が変わったため対応作業が必要になりました

検証システム
CPU AMD A10-7800 (3.1GHz 4コア)
メモリ 16GB
OS Gentoo-1.12.14 Linux-4.7.0 x86_64 UTF-8
コンパイラ gcc-6.1.0
Cライブラリ glibc-2.24
OpenSSL OpenSSL-1.1.0
OpenSSH OpenSSH-7.3p1

OpenSSLに依存しているアプリケーションは ソースコードレベルで修正行ってましたが
特に OpenSSHが修正量が大きめだったので修正パッチを作りついでに公開します

OpenSSH-7.3p1向け OpenSSL1.1.x対応 Unix98PTY化パッチ

  • 他のサイトで公開されているパッチをベースにしています
  • 自環境は Unix98仕様の PTY(擬似端末環境)ですが
    OpenSSHがなぜか BSD仕様 PTY環境と認識してしまい うまく仮想端末が開かないため
    sshpty.c も修正を行い強制的に Unix98仕様にしています

Unix98仕様かどうか確認するには /dev/ 配下に ptmx と pts** があるか確認
BSD仕様かどうか確認するには /dev/ 配下に pty** と tty** があるか確認

パッチの摘要は openssh-* ディレクトリ配下で下記のようにコマンドを打ってください

$ patch -p1 < ../openssh-7.3p1-ssl1.1.x.patch
patching file cipher-3des1.c
patching file cipher-bf1.c
patching file cipher.c
patching file cipher.h
patching file dh.c
patching file dh.h
patching file digest-openssl.c
patching file kexdhc.c
patching file kexdhs.c
patching file kexgexc.c
patching file kexgexs.c
patching file monitor.c
patching file regress/unittests/sshkey/test_file.c
patching file regress/unittests/sshkey/test_sshkey.c
patching file rsa.c
patching file rsa.h
patching file ssh-dss.c
patching file ssh-ecdsa.c
patching file ssh-keygen.c
patching file ssh-pkcs11-client.c
patching file ssh-pkcs11.c
patching file ssh-rsa.c
patching file sshkey.c
patching file sshpty.c
$
 
OpenSSHを普通にビルドすると 下記のようにエラーとなります

OpenSSH has been configured with the following options:
                     User binaries: /usr/bin
                   System binaries: /usr/sbin
               Configuration files: /usr/etc/ssh
                   Askpass program: /usr/libexec/ssh-askpass
                      Manual pages: /usr/share/man/manX
                          PID file: /var/run
  Privilege separation chroot path: /var/empty
            sshd default user PATH: /usr/bin:/bin:/usr/sbin:/sbin
                    Manpage format: man
                       PAM support: no
                   OSF SIA support: no
                 KerberosV support: no
                   SELinux support: no
                 Smartcard support: 
                     S/KEY support: no
              MD5 password support: no
                   libedit support: no
  Solaris process contract support: no
           Solaris project support: no
         Solaris privilege support: no
       IP address in $DISPLAY hack: no
           Translate v4 in v6 hack: yes
                  BSD Auth support: no
              Random number source: OpenSSL internal ONLY
             Privsep sandbox style: seccomp_filter

              Host: x86_64-unknown-linux-gnu
          Compiler: gcc
    Compiler flags: -g -O2 -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset -fstack-protector-strong -fPIE 
Preprocessor flags: -I/usr/include 
      Linker flags: -L/usr/lib  -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -fstack-protector-strong -pie
         Libraries: -lcrypto -ldl -lutil -lz  -lcrypt -lresolv

$ make

....

In file included from ssh_api.h:26:0,
                 from ssh_api.c:20:
cipher.h:69:17: エラー: フィールド ‘evp’ が不完全型を持っています
  EVP_CIPHER_CTX evp;
                 ^~~
make: *** [ssh_api.o] エラー 1
$
 

OpenSSL-1.1.0になって EVP_CIPHER_CTXなどのインスタンスが直接生成てきなかったり
他にも OpenSSLが提供する関数を経由しなければ利用できなくなったりといった変更があります

そのうち 他のアプリも含めて OpenSSL-1.1.x系に対応するようになるのでしょうか