Hello,

Adam recently contacted me as a random DD, as he was interested in
getting Bashbro into Debian.  As a courtesy to the others that have
visited with him about it, here is an excerpt of my response.

Hi Adam,

That's a pretty neat concept!  I'm impressed - HTTP serving in bash.  It
wouldn't have occurred to me.  A neat idea!  And, I'm glad that you're
interested in Debian!

When considering adding a package to Debian, we remember that adding a
package is expensive.  That is, it requires infrastructure resources,
human time (reviewing uploads, etc), bandwidth, disk space, etc.  It
also implies commitments for future humans: security team, etc.

So there are some broad criteria we look at when considering adding a
package:

1) Does it duplicate existing functionality?  If so, is it sufficiently
different/better to justify inclusion anyhow?

2) Is it likely to be actively maintained for the extended lifetime of a
release (several years)?

3) Is it of high quality?

Debian already contains this kind of functionality in the default
install (run python -m http.server 9000, for instance; see
https://docs.python.org/3/library/http.server.html#http-server-security
).  There are also numerous other minimal HTTP servers in Debian
already.  So the question is: is this sufficiently better to justify the
effort?

The main thing I'm concerned about here is security.  Writing HTTP code
is notoriously difficult and I'm sure there have been thousands of CVEs
over the years related to it.  So off the bat, writing one's own
HTTP-parsing code implies a base-level risk.

I note you have made a solid effort to use good shell quoting
practices -- excellent.  Remember that on most Linux filesystems, every
8-bit character except 0x00 and '/' is valid in a filename.  So,
consider what would happen if you had to deal with a filename or a
request:

- Beginning with '-'
- Beginning with "of="
- Contains '+', '?', ' ', or '&'
- Containing %0D, %0A, %00, %20, %FF, or their unencoded versions
- Is 1GB long (what does "read" do with that?)
- Has headers that are 1GB long
- Contains ANSI terminal-manipulation sequences
- Contains a byte sequence that isn't valid UTF-8 while run in a UTF-8 locale

Just to pass on examples here...

'+' should expand to a space, but urldecode() doesn't.

Calling dd with of=blah would overwrite blah.

The behavior of file could be significantly altered by a request
beginning with '-'.

I'm not really sure what an embedded NULL character would do.

In short, it is extremely difficult to write a shell script that is
robust against untrusted input, and I can immediately spot some
potential issues here.  Log/verbose output may additionally scramble the
user's terminal or otherwise conceal malicious attempts.

Besides that, it has some important missing functionality.  Most
importantly, because it doesn't support HTTP/1.1, it doesn't support
ranged requests (resumption) or a way for the client to know
affirmatively if it got the entire file.  Of course, it is also quite
inefficient but that may not matter too much for the intended use case.

So, as an example program, this is fantastic.  As something that Debian
as a project would like to support users actually using, is has some
notable drawbacks against the minimal option already included in Debian.

I would heartily recommend this to someone as an exercise to learn about
bash programming -- especially if they are able to spot the things I
highlighted above (or others).  But I'm afraid that, as a Debian
sysadmin, I wouldn't want to support this for users or have it installed
on my system for real use.  I suspect that the ftpmasters wouldn't
accept it into the distribution, and that may be why there hasn't been a
sponsor.

If you would like to package up something else for Debian, I'd be happy
to look at it for you though!

Regards,

- John

Reply via email to