Ports tree insecure because of IGNOREFILES+IGNORE

philj at openmailbox.org philj at openmailbox.org
Sun Jun 22 12:31:54 UTC 2014


The IGNOREFILES+IGNORE mechanism allows port maintainers to disable 
checksum
checks. I feel that this mechanism is a stain on an otherwise fantastic 
ports
system. It reduces user confidence in security and makes us all sitting 
ducks
for sophisticated adversaries.

Possible changes:
(i) removing the IGNOREFILES+IGNORE mechanism entirely if practical.
(ii) centralizing the mechanism with a vetting process involving a 
(highly
paranoid) security officer.
(iii) requiring users to add a switch to /etc/make.conf or otherwise to 
OK
installation of ports with checksum-disabled components. Awareness and 
choice
breed confidence.

===================================
CATEGORY 1: PROBLEMATIC EXECUTABLES
===================================

biology/platon
-----------------------------------------------------------------------------
# This port only has snapshot archive
IGNOREFILES=    platon.tar.gz
SHA256 (platon.tar.gz) = IGNORE
-----------------------------------------------------------------------------
Notes: executable.

games/xroach
-----------------------------------------------------------------------------
IGNOREFILES=    ${DISTFILES}
SHA256 (xroach.tar.gz) = IGNORE
-----------------------------------------------------------------------------
Notes: executable.

net/bindtest
-----------------------------------------------------------------------------
IGNOREFILES=    ${DISTNAME}${EXTRACT_SUFX}
SHA256 (bindtest.tgz) = IGNORE
-----------------------------------------------------------------------------
Notes: executable.

print/lgrind
-----------------------------------------------------------------------------
IGNOREFILES=    ${PORTNAME}.tar.gz
SHA256 (lgrind/lgrind.tar.gz) = IGNORE
-----------------------------------------------------------------------------
Notes: executable. It doesn't checksum the distfile, but it *does* 
checksum
the distfile's contents. This offers less resistance for a maliciously
corrupted tarball. Checksumming the distfile itself guards access to the
archiver programs and libraries, among other things. Another problem 
with this
checksum-the-contents approach is that there appears to be no protection
against extraneous contents, which could be a problem if wildcards are 
used
somewhere in the build/install process.

www/lifetype
-----------------------------------------------------------------------------
IGNOREFILES=    ${CONTRIBE_VERSION}__all_plugins.zip \
                 ${CONTRIBE_VERSION}__all_templates.zip
SHA256 (1.2__all_plugins.zip) = IGNORE
SHA256 (1.2__all_templates.zip) = IGNORE
-----------------------------------------------------------------------------
Notes: executable (PHP files, etc.).

=======================================
CATEGORY 2: PROBLEMATIC NON-EXECUTABLES
=======================================

These include documentation files and program data files. Malicious 
corruption
would target any code on the system that processes the files (see
japanese/edict below for an example of how a program can be targeted 
during
the build process). A lot of the time, the risk is no doubt negligible, 
to the
point where it's more of a risk to use the ports system itself, with 
fetch(1)
and other helper programs as potential targets.

devel/root-doc
-----------------------------------------------------------------------------
IGNOREFILES=    ${DISTFILES}
SHA256 (html502.tar.gz) = IGNORE
-----------------------------------------------------------------------------
Notes: intended to be documentation only, but effectively an opaque 
tarball
crafted in an unknown manner and containing unknown contents that gets a 
free
ride beyond the checksum point.

games/ftjava
-----------------------------------------------------------------------------
IGNOREFILES=    FTJava_Documentation.html faq.html FTJava_Linux.html
SHA256 (ftjava/FTJava_Documentation.html) = IGNORE
SHA256 (ftjava/faq.html) = IGNORE
SHA256 (ftjava/FTJava_Linux.html) = IGNORE
-----------------------------------------------------------------------------
Notes: documentation.

japanese/edict
-----------------------------------------------------------------------------
#
# These change too often and are not made into executables.
#
IGNOREFILES=    ${DICTFILES} ${DOCFILES}
SHA256 (edict/edict.gz) = IGNORE
SHA256 (edict/edicth) = IGNORE
SHA256 (edict/enamdict.gz) = IGNORE
SHA256 (edict/compdic.gz) = IGNORE
SHA256 (edict/j_places.gz) = IGNORE
SHA256 (edict/ediclsd3.zip) = IGNORE
SHA256 (edict/kanjidic.gz) = IGNORE
SHA256 (edict/kanjd212.gz) = IGNORE
SHA256 (edict/lawgledt.zip) = IGNORE
SHA256 (edict/lingdic.zip) = IGNORE
SHA256 (edict/geodic.gz) = IGNORE
SHA256 (edict/pandpdic.zip) = IGNORE
SHA256 (edict/aviation.zip) = IGNORE
SHA256 (edict/findic.zip) = IGNORE
SHA256 (edict/mktdic.zip) = IGNORE
SHA256 (edict/4jword3_edict.zip) = IGNORE
SHA256 (edict/concrete.zip) = IGNORE
SHA256 (edict/edict_doc.html) = IGNORE
SHA256 (edict/edicth.doc) = IGNORE
SHA256 (edict/enamdict_doc.txt) = IGNORE
SHA256 (edict/enamdict_doc.html) = IGNORE
SHA256 (edict/j_places.inf) = IGNORE
SHA256 (edict/kanjidic.doc) = IGNORE
SHA256 (edict/kanjd212.doc) = IGNORE
SHA256 (edict/ediclsd3.rme) = IGNORE
SHA256 (edict/lawgldoc.new) = IGNORE
SHA256 (edict/lingdic.txt) = IGNORE
SHA256 (edict/geodic.doc) = IGNORE
SHA256 (edict/aviation.txt) = IGNORE
SHA256 (edict/findic.doc) = IGNORE
SHA256 (edict/mktdic.doc) = IGNORE
SHA256 (edict/4jword3_inf.txt) = IGNORE
SHA256 (edict/concrete.doc) = IGNORE
-----------------------------------------------------------------------------
Notes: program data files that get a free ride beyond the checksum 
point,
including having the port Makefile run the dictionaries through xjdxgen, 
a
EUC-JP index generator last updated in 1998 that can easily be forced to
overflow malloc'd memory with sizeof(long) bytes of data because of an 
off-by-
one index calculation:

jindex = (unsigned long *)malloc(indlen);
// ...
if (indptr > indlen/sizeof(long))) {
     printf("Index table overflow. Dictionary too large?\n");
     exit(1);
}

Here we write sizeof(long) bytes past a 12-byte buffer:

157       indlen = (diclen * 3*(sizeof(long)/4))/4;
(gdb)
158       jindex = (unsigned long *)malloc(indlen);
(gdb)
159       if(jindex == NULL)
(gdb) p indlen
$1 = 12
(gdb) x/16b jindex
0x28210030:     0       0       0       0       0       0       0       
0
0x28210038:     0       0       0       0       0       0       0       
0
(gdb) b 255 if indptr == 3
Breakpoint 3 at 0x8048fa7: file xjdxgen.c, line 255.
(gdb) c
Continuing.
255                               jindex[indptr] = schi;
(gdb) p indptr
$2 = 3
(gdb) x/16b jindex
0x28210030:     0       0       0       0       1       0       0       
0
0x28210038:     4       0       0       0       0       0       0       
0
(gdb) n
256                               cstrp = 1;
(gdb) x/16b jindex
0x28210030:     0       0       0       0       1       0       0       
0
0x28210038:     4       0       0       0       7       0       0       
0
(gdb)

There are potentially more severe problems that would require 
significantly
more time to examine. This port is relatively inconsequential. The above 
is
purely to illustrate a wider point.

mail/spambnc
-----------------------------------------------------------------------------
IGNOREFILES=    quickstart.shtml
IGNOREFILES+=   upgrading.shtml
SHA256 (spambnc-20060416/quickstart.shtml) = IGNORE
SHA256 (spambnc-20060416/upgrading.shtml) = IGNORE
-----------------------------------------------------------------------------
Notes: documentation.

math/libflame
-----------------------------------------------------------------------------
IGNOREFILES=    libflame.pdf
SHA256 (libflame.pdf) = IGNORE
-----------------------------------------------------------------------------
Notes: documentation.

net-mgmt/kismet
-----------------------------------------------------------------------------
IGNOREFILES=    manuf
SHA256 (kismet/manuf) = IGNORE
-----------------------------------------------------------------------------
Notes: documentation.

net/ntopng
-----------------------------------------------------------------------------
IGNOREFILES=    GeoLiteCity.dat.gz GeoLiteCityv6.dat.gz \
                 GeoIPASNum.dat.gz GeoIPASNumv6.dat.gz
SHA256 (GeoLiteCity.dat.gz) = IGNORE
SHA256 (GeoLiteCityv6.dat.gz) = IGNORE
SHA256 (GeoIPASNum.dat.gz) = IGNORE
SHA256 (GeoIPASNumv6.dat.gz) = IGNORE
-----------------------------------------------------------------------------
Notes: program data files with uninvestigated impact.

sysutils/apcupsd
-----------------------------------------------------------------------------
IGNOREFILES=    ${PORTNAME}.pdf
SHA256 (apcupsd.pdf) = IGNORE
-----------------------------------------------------------------------------
Notes: documentation.

www/dillo2
-----------------------------------------------------------------------------
IGNOREFILES+=   hyph-${_l}.pat.txt
SHA256 (dillo/hyph-af.pat.txt) = IGNORE
SHA256 (dillo/hyph-as.pat.txt) = IGNORE
SHA256 (dillo/hyph-bg.pat.txt) = IGNORE
SHA256 (dillo/hyph-bn.pat.txt) = IGNORE
SHA256 (dillo/hyph-ca.pat.txt) = IGNORE
SHA256 (dillo/hyph-cop.pat.txt) = IGNORE
SHA256 (dillo/hyph-cs.pat.txt) = IGNORE
SHA256 (dillo/hyph-cy.pat.txt) = IGNORE
SHA256 (dillo/hyph-da.pat.txt) = IGNORE
SHA256 (dillo/hyph-de-1901.pat.txt) = IGNORE
SHA256 (dillo/hyph-de-1996.pat.txt) = IGNORE
SHA256 (dillo/hyph-de-ch-1901.pat.txt) = IGNORE
SHA256 (dillo/hyph-el-monoton.pat.txt) = IGNORE
SHA256 (dillo/hyph-el-polyton.pat.txt) = IGNORE
SHA256 (dillo/hyph-en-gb.pat.txt) = IGNORE
SHA256 (dillo/hyph-en-us.pat.txt) = IGNORE
SHA256 (dillo/hyph-eo.pat.txt) = IGNORE
SHA256 (dillo/hyph-es.pat.txt) = IGNORE
SHA256 (dillo/hyph-et.pat.txt) = IGNORE
SHA256 (dillo/hyph-eu.pat.txt) = IGNORE
SHA256 (dillo/hyph-fi.pat.txt) = IGNORE
SHA256 (dillo/hyph-fr.pat.txt) = IGNORE
SHA256 (dillo/hyph-fur.pat.txt) = IGNORE
SHA256 (dillo/hyph-ga.pat.txt) = IGNORE
SHA256 (dillo/hyph-gl.pat.txt) = IGNORE
SHA256 (dillo/hyph-grc.pat.txt) = IGNORE
SHA256 (dillo/hyph-gu.pat.txt) = IGNORE
SHA256 (dillo/hyph-hi.pat.txt) = IGNORE
SHA256 (dillo/hyph-hr.pat.txt) = IGNORE
SHA256 (dillo/hyph-hsb.pat.txt) = IGNORE
SHA256 (dillo/hyph-hu.pat.txt) = IGNORE
SHA256 (dillo/hyph-hy.pat.txt) = IGNORE
SHA256 (dillo/hyph-ia.pat.txt) = IGNORE
SHA256 (dillo/hyph-id.pat.txt) = IGNORE
SHA256 (dillo/hyph-is.pat.txt) = IGNORE
SHA256 (dillo/hyph-it.pat.txt) = IGNORE
SHA256 (dillo/hyph-kmr.pat.txt) = IGNORE
SHA256 (dillo/hyph-kn.pat.txt) = IGNORE
SHA256 (dillo/hyph-la.pat.txt) = IGNORE
SHA256 (dillo/hyph-lt.pat.txt) = IGNORE
SHA256 (dillo/hyph-lv.pat.txt) = IGNORE
SHA256 (dillo/hyph-ml.pat.txt) = IGNORE
SHA256 (dillo/hyph-mn-cyrl.pat.txt) = IGNORE
SHA256 (dillo/hyph-mr.pat.txt) = IGNORE
SHA256 (dillo/hyph-mul-ethi.pat.txt) = IGNORE
SHA256 (dillo/hyph-nb.pat.txt) = IGNORE
SHA256 (dillo/hyph-nl.pat.txt) = IGNORE
SHA256 (dillo/hyph-nn.pat.txt) = IGNORE
SHA256 (dillo/hyph-or.pat.txt) = IGNORE
SHA256 (dillo/hyph-pa.pat.txt) = IGNORE
SHA256 (dillo/hyph-pl.pat.txt) = IGNORE
SHA256 (dillo/hyph-pms.pat.txt) = IGNORE
SHA256 (dillo/hyph-pt.pat.txt) = IGNORE
SHA256 (dillo/hyph-rm.pat.txt) = IGNORE
SHA256 (dillo/hyph-ro.pat.txt) = IGNORE
SHA256 (dillo/hyph-ru.pat.txt) = IGNORE
SHA256 (dillo/hyph-sa.pat.txt) = IGNORE
SHA256 (dillo/hyph-sh-cyrl.pat.txt) = IGNORE
SHA256 (dillo/hyph-sh-latn.pat.txt) = IGNORE
SHA256 (dillo/hyph-sk.pat.txt) = IGNORE
SHA256 (dillo/hyph-sl.pat.txt) = IGNORE
SHA256 (dillo/hyph-sr-cyrl.pat.txt) = IGNORE
SHA256 (dillo/hyph-sv.pat.txt) = IGNORE
SHA256 (dillo/hyph-ta.pat.txt) = IGNORE
SHA256 (dillo/hyph-te.pat.txt) = IGNORE
SHA256 (dillo/hyph-tk.pat.txt) = IGNORE
SHA256 (dillo/hyph-tr.pat.txt) = IGNORE
SHA256 (dillo/hyph-uk.pat.txt) = IGNORE
SHA256 (dillo/hyph-zh-latn-pinyin.pat.txt) = IGNORE
-----------------------------------------------------------------------------
Notes: program data files with uninvestigated impact.

www/thttpd
-----------------------------------------------------------------------------
IGNOREFILES=    notes.html
SHA256 (thttpd/notes.html) = IGNORE
-----------------------------------------------------------------------------
Notes: documentation.

=========================
CATEGORY 3: OK... FOR NOW
=========================

"OK" here means the user is at least making a conscious decision.

biology/blast
-----------------------------------------------------------------------------
# Distfiles change rapidly, but since they can only be downloaded from
# the author, this is not a problem.
IGNOREFILES=    ${DISTFILES}
SHA256 (blast2.freebsd-6.x-i686.tar.Z) = IGNORE
SHA256 (blast2.freebsd-6.x-x64.tar.Z) = IGNORE
-----------------------------------------------------------------------------
Notes: executable code, but port asks user to download distfile 
manually.

chinese/msttf
-----------------------------------------------------------------------------
IGNOREFILES=    ${MSTTF_SIMHEI} ${MSTTF_SIMSUN} ${MSTTF_TAHOMA}
SHA256 (msttf/simhei.ttf) = IGNORE
SHA256 (msttf/simsun.ttc) = IGNORE
SHA256 (msttf/tahoma.ttf) = IGNORE
-----------------------------------------------------------------------------
Notes: port asks user to grab three font files from Windows computer.

multimedia/pvr250
-----------------------------------------------------------------------------
IGNOREFILES=    hcwPVRP2.sys    # Varies from month to month
SHA256 (hcwPVRP2.sys) = IGNORE
-----------------------------------------------------------------------------
Notes: binary driver, but port asks user to grab it from the product CD.

multimedia/pvrxxx
-----------------------------------------------------------------------------
IGNOREFILES=    hcwPVRP2.sys    # Varies from month to month
SHA256 (hcwPVRP2.sys) = IGNORE
-----------------------------------------------------------------------------
Notes: binary driver, but port asks user to grab it from the product CD.



More information about the freebsd-ports mailing list