/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 Hogeborn
  • Date: 2016-03-17 20:40:55 UTC
  • Revision ID: teddy@recompile.se-20160317204055-bhsh5xsidq7w5cxu
Client: Fix plymouth agent; broken since 1.7.2.

Fix an very old memory bug in the plymouth agent (which has been
present since its apperance in version 1.2), but which was only
recently detected at run time due to the new -fsanitize=address
compile- time flag, which has been used since version 1.7.2.  This
detection of a memory access violation causes the program to abort,
making the Plymouth graphical boot system unable to accept interactive
input of passwords when using the Mandos client.

* plugins.d/plymouth.c (exec_and_wait): Fix memory allocation bug when
  allocating new_argv.  Also tolerate a zero-length argv.

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
 
 
20
18
set -e
21
19
 
22
20
# Update the initial RAM file system image
23
21
update_initramfs()
24
22
{
25
 
    if command -v update-initramfs >/dev/null; then
26
 
        update-initramfs -k all -u 1>&2
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
 
            if [ -e /boot/initrd.img-"$kversion" ]; then
41
 
                chmod go-r /boot/initrd.img-"$kversion"
42
 
            else
43
 
                # An initrd image has not yet been created for this
44
 
                # kernel, possibly because this new kernel is about to
45
 
                # be, but has not yet been, installed.  In this case,
46
 
                # we create an empty file with the right permissions
47
 
                # so that Dracut will preserve those permissions when
48
 
                # it creates the real, new initrd image for this
49
 
                # kernel.
50
 
                install --mode=u=rw /dev/null \
51
 
                        /boot/initrd.img-"$kversion"
52
 
            fi
53
 
            if [ "$kversion" != "*" ]; then
54
 
                /etc/kernel/postinst.d/dracut "$kversion" 1>&2
55
 
            fi
56
 
        done
57
 
    fi
 
23
    update-initramfs -u -k all
58
24
    
59
25
    if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
60
26
        # Make old initrd.img files unreadable too, in case they were
70
36
    if dpkg --compare-versions "$2" lt "1.0.3-1"; then
71
37
        case "`getent passwd mandos`" in
72
38
            *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
73
 
                usermod --login _mandos mandos 1>&2
74
 
                groupmod --new-name _mandos mandos 1>&2
 
39
                usermod --login _mandos mandos
 
40
                groupmod --new-name _mandos mandos
75
41
                return
76
42
                ;;
77
43
        esac
80
46
    if ! getent passwd _mandos >/dev/null; then
81
47
        adduser --system --force-badname --quiet --home /nonexistent \
82
48
            --no-create-home --group --disabled-password \
83
 
            --gecos "Mandos password system" _mandos 1>&2
 
49
            --gecos "Mandos password system" _mandos
84
50
    fi
85
51
}
86
52
 
87
 
# Create client key pairs
88
 
create_keys(){
89
 
    # If the OpenPGP key files do not exist, generate all keys using
90
 
    # mandos-keygen
91
 
    if ! [ -r /etc/keys/mandos/pubkey.txt \
92
 
              -a -r /etc/keys/mandos/seckey.txt ]; then
93
 
        mandos-keygen 1>&2
94
 
        gpg-connect-agent KILLAGENT /bye 1>&2 || :
95
 
        return 0
96
 
    fi
97
 
 
98
 
    # Remove any bad TLS keys by 1.8.0-1
99
 
    if dpkg --compare-versions "$2" eq "1.8.0-1" \
100
 
       || dpkg --compare-versions "$2" eq "1.8.0-1~bpo9+1"; then
101
 
        # Is the key bad?
102
 
        if ! certtool --password='' \
103
 
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
104
 
             --outfile=/dev/null --pubkey-info --no-text \
105
 
              1>&2 2>/dev/null; then
106
 
            shred --remove -- /etc/keys/mandos/tls-privkey.pem \
107
 
                  2>/dev/null || :
108
 
            rm --force -- /etc/keys/mandos/tls-pubkey.pem
109
 
        fi
110
 
    fi
111
 
 
112
 
    # If the TLS keys already exists, do nothing
113
 
    if [ -r /etc/keys/mandos/tls-privkey.pem \
114
 
            -a -r /etc/keys/mandos/tls-pubkey.pem ]; then
115
 
        return 0
116
 
    fi
117
 
 
118
 
    # Try to create the TLS keys
119
 
 
120
 
    TLS_PRIVKEYTMP="`mktemp -t mandos-client-privkey.XXXXXXXXXX`"
121
 
 
122
 
    if certtool --generate-privkey --password='' \
123
 
                --outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
124
 
                --key-type=ed25519 --pkcs8 --no-text 1>&2 \
125
 
                2>/dev/null; then
126
 
 
127
 
        local umask=$(umask)
128
 
        umask 077
129
 
        cp --archive "$TLS_PRIVKEYTMP" /etc/keys/mandos/tls-privkey.pem
130
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
131
 
 
132
 
        # First try certtool from GnuTLS
133
 
        if ! certtool --password='' \
134
 
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
135
 
             --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
136
 
             --no-text 1>&2 2>/dev/null; then
137
 
            # Otherwise try OpenSSL
138
 
            if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
139
 
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout \
140
 
                 1>&2; then
141
 
                rm --force /etc/keys/mandos/tls-pubkey.pem
142
 
                # None of the commands succeded; give up
143
 
                umask $umask
144
 
                return 1
145
 
            fi
146
 
        fi
147
 
        umask $umask
148
 
 
149
 
        key_id=$(mandos-keygen --passfile=/dev/null \
150
 
                     | grep --regexp="^key_id[ =]")
151
 
 
152
 
        db_version 2.0
153
 
        db_fset mandos-client/key_id seen false
154
 
        db_reset mandos-client/key_id
155
 
        db_subst mandos-client/key_id key_id $key_id
156
 
        db_input critical mandos-client/key_id || true
157
 
        db_go
158
 
        db_stop
159
 
    else
160
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
161
 
    fi
 
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
162
60
}
163
61
 
164
62
create_dh_params(){
169
67
    DHFILE="`mktemp -t mandos-client-dh-parameters.XXXXXXXXXX.pem`"
170
68
    # First try certtool from GnuTLS
171
69
    if ! certtool --generate-dh-params --sec-param high \
172
 
         --outfile "$DHFILE" 1>&2; then
 
70
         --outfile "$DHFILE"; then
173
71
        # Otherwise try OpenSSL
174
72
        if ! openssl genpkey -genparam -algorithm DH -out "$DHFILE" \
175
 
             -pkeyopt dh_paramgen_prime_len:3072 1>&2; then
 
73
             -pkeyopt dh_paramgen_prime_len:3072; then
176
74
            # None of the commands succeded; give up
177
 
            rm --force -- "$DHFILE"
 
75
            rm -- "$DHFILE"
178
76
            return 1
179
77
        fi
180
78
    fi
183
81
    sed --in-place --expression='1i-----BEGIN DH PARAMETERS-----' \
184
82
            "$DHFILE"
185
83
    cp --archive "$DHFILE" /etc/keys/mandos/dhparams.pem
186
 
    rm --force -- "$DHFILE"
 
84
    rm -- "$DHFILE"
187
85
}
188
86
 
189
87
case "$1" in
190
88
    configure)
191
89
        add_mandos_user "$@"
192
 
        create_keys "$@"
 
90
        create_key "$@"
193
91
        create_dh_params "$@" || :
194
92
        update_initramfs "$@"
195
 
        if dpkg --compare-versions "$2" lt-nl "1.7.10-1"; then
196
 
            PLUGINHELPERDIR=/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null)/mandos/plugin-helpers
197
 
            if ! dpkg-statoverride --list "$PLUGINHELPERDIR" \
198
 
                 >/dev/null 2>&1; then
199
 
                chmod u=rwx,go= -- "$PLUGINHELPERDIR"
200
 
            fi
201
 
            if ! dpkg-statoverride --list /etc/mandos/plugin-helpers \
202
 
                 >/dev/null 2>&1; then
203
 
                chmod u=rwx,go= -- /etc/mandos/plugin-helpers
204
 
            fi
205
 
        fi
206
93
        ;;
207
94
    abort-upgrade|abort-deconfigure|abort-remove)
208
95
        ;;