/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to debian/mandos-client.postinst

  • Committer: teddy at recompile
  • Date: 2020-12-03 20:30:45 UTC
  • Revision ID: teddy@recompile.se-20201203203045-iqd6nq9y5nwalh1x
Minor fix of a test function

In dracut-module/password-agent, the test function
test_send_password_to_socket_EMSGSIZE() (which tests that the
send_password_to_socket() task function aborts properly when getting
EMSGSIZE when writing to the password socket), part of the test code
is supposed to find a message size which definitely does trigger
EMSGSIZE when send()ing to a socket.  Without a "break" in the proper
place, however, the size given is always exactly 1024 bytes too large.

This is very probably not a problem, since a too large message will
still be too large if it is increased by 1024 bytes, and send(2) in
practice checks the size before reading the buffer.  The biggest issue
would be if some version of send(2) would try to look at the last 1024
bytes of the message buffer before checking the message size; this
would then lead to a buffer over-read when running this test function.
(But even then there would be no security implications since the tests
are not run in the normal operation of the program.)

* dracut-module/password-agent.c
  (test_send_password_to_socket_EMSGSIZE): Break out early when ssret
  < 0 and errno == EMSGSIZE; don't allow loop to increase message_size
  again.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# If prerm fails during replacement due to conflict:
16
16
#       <postinst> abort-remove in-favour <new-package> <version>
17
17
 
 
18
. /usr/share/debconf/confmodule
 
19
 
18
20
set -e
19
21
 
20
22
# Update the initial RAM file system image
21
23
update_initramfs()
22
24
{
23
 
    update-initramfs -u -k all
 
25
    if command -v update-initramfs >/dev/null; then
 
26
        update-initramfs -k all -u
 
27
    elif command -v dracut >/dev/null; then
 
28
        dracut_version="`dpkg-query --showformat='${Version}' --show dracut`"
 
29
        if dpkg --compare-versions "$dracut_version" lt 043-1 \
 
30
                && bash -c '. /etc/dracut.conf; . /etc/dracut.conf.d/*; [ "$hostonly" != yes ]'; then
 
31
            echo 'Dracut is not configured to use hostonly mode!' >&2
 
32
            return 1
 
33
        fi
 
34
        # Logic taken from dracut.postinst
 
35
        for kernel in /boot/vmlinu[xz]-*; do
 
36
            kversion="${kernel#/boot/vmlinu[xz]-}"
 
37
            # Dracut preserves old permissions of initramfs image
 
38
            # files, so we adjust permissions before creating new
 
39
            # initramfs image containing secret keys.
 
40
            chmod go-r /boot/initrd.img-"$kversion"
 
41
            if [ "$kversion" != "*" ]; then
 
42
                /etc/kernel/postinst.d/dracut "$kversion"
 
43
            fi
 
44
        done
 
45
    fi
24
46
    
25
47
    if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
26
48
        # Make old initrd.img files unreadable too, in case they were
50
72
    fi
51
73
}
52
74
 
53
 
# Create client key pair
54
 
create_key(){
55
 
    if [ -r /etc/keys/mandos/pubkey.txt \
56
 
        -a -r /etc/keys/mandos/seckey.txt ]; then
57
 
        return 0
58
 
    fi
59
 
    mandos-keygen
 
75
# Create client key pairs
 
76
create_keys(){
 
77
    # If the OpenPGP key files do not exist, generate all keys using
 
78
    # mandos-keygen
 
79
    if ! [ -r /etc/keys/mandos/pubkey.txt \
 
80
              -a -r /etc/keys/mandos/seckey.txt ]; then
 
81
        mandos-keygen
 
82
        gpg-connect-agent KILLAGENT /bye || :
 
83
        return 0
 
84
    fi
 
85
 
 
86
    # Remove any bad TLS keys by 1.8.0-1
 
87
    if dpkg --compare-versions "$2" eq "1.8.0-1" \
 
88
       || dpkg --compare-versions "$2" eq "1.8.0-1~bpo9+1"; then
 
89
        # Is the key bad?
 
90
        if ! certtool --password='' \
 
91
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
 
92
             --outfile=/dev/null --pubkey-info --no-text \
 
93
             2>/dev/null; then
 
94
            shred --remove -- /etc/keys/mandos/tls-privkey.pem \
 
95
                  2>/dev/null || :
 
96
            rm --force -- /etc/keys/mandos/tls-pubkey.pem
 
97
        fi
 
98
    fi
 
99
 
 
100
    # If the TLS keys already exists, do nothing
 
101
    if [ -r /etc/keys/mandos/tls-privkey.pem \
 
102
            -a -r /etc/keys/mandos/tls-pubkey.pem ]; then
 
103
        return 0
 
104
    fi
 
105
 
 
106
    # Try to create the TLS keys
 
107
 
 
108
    TLS_PRIVKEYTMP="`mktemp -t mandos-client-privkey.XXXXXXXXXX`"
 
109
 
 
110
    if certtool --generate-privkey --password='' \
 
111
                --outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
 
112
                --key-type=ed25519 --pkcs8 --no-text 2>/dev/null; then
 
113
 
 
114
        local umask=$(umask)
 
115
        umask 077
 
116
        cp --archive "$TLS_PRIVKEYTMP" /etc/keys/mandos/tls-privkey.pem
 
117
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
 
118
 
 
119
        # First try certtool from GnuTLS
 
120
        if ! certtool --password='' \
 
121
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
 
122
             --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
 
123
             --no-text 2>/dev/null; then
 
124
            # Otherwise try OpenSSL
 
125
            if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
 
126
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout; then
 
127
                rm --force /etc/keys/mandos/tls-pubkey.pem
 
128
                # None of the commands succeded; give up
 
129
                umask $umask
 
130
                return 1
 
131
            fi
 
132
        fi
 
133
        umask $umask
 
134
 
 
135
        key_id=$(mandos-keygen --passfile=/dev/null \
 
136
                     | grep --regexp="^key_id[ =]")
 
137
 
 
138
        db_version 2.0
 
139
        db_fset mandos-client/key_id seen false
 
140
        db_reset mandos-client/key_id
 
141
        db_subst mandos-client/key_id key_id $key_id
 
142
        db_input critical mandos-client/key_id || true
 
143
        db_go
 
144
        db_stop
 
145
    else
 
146
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
 
147
    fi
60
148
}
61
149
 
62
150
create_dh_params(){
87
175
case "$1" in
88
176
    configure)
89
177
        add_mandos_user "$@"
90
 
        create_key "$@"
 
178
        create_keys "$@"
91
179
        create_dh_params "$@" || :
92
180
        update_initramfs "$@"
93
 
        if dpkg --compare-versions "$2" lt-nl "1.7.7-1"; then
 
181
        if dpkg --compare-versions "$2" lt-nl "1.7.10-1"; then
94
182
            PLUGINHELPERDIR=/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null)/mandos/plugin-helpers
95
183
            if ! dpkg-statoverride --list "$PLUGINHELPERDIR" \
96
184
                 >/dev/null 2>&1; then