1
0

more security information in man page, -t option (thanks silt)

This commit is contained in:
dtb 2023-12-15 19:39:18 -07:00
parent e7f886a40a
commit 8cd268317f
2 changed files with 25 additions and 6 deletions

View File

@ -43,6 +43,10 @@ The
.B -p
option is provided as a convenience and to avoid potential insecure programmer
error in scripts.
.PP
The
.B -t
option makes peek exit if not run in a terminal.
.SH DIAGNOSTICS
@ -51,13 +55,21 @@ sysexits(3) if it encounters an error.
.SH BUGS
Accepting secrets in shell scripts is not adviseable.
Accepting secrets in shell scripts is not adviseable in any context.
.PP
The user's environment passed through to the program used with the
.B -p
option and their PATH environment variable is used to locate the program.
If used in a safety-critical application it must be ensured that the
environment with which peek is used is not compromised.
environment with which peek is used is not compromised. For example, using
POSIX env(1) to set a known, safe PATH, and htpasswd(1) from Apache's utilities
package to hash the input with bcrypt:
.PP
.R env -i PATH=/usr/bin peek -1p htpasswd -nBi '' | cut -d : -f 2
.PP
On systems that support it, the ioctl(2) command TIOCSTI can be used to insert
characters into the standard input going to peek. This doesn't allow snooping
but can be used for general mischief.
.SH COPYRIGHT
@ -65,4 +77,4 @@ Public domain.
.SH SEE ALSO
env(1), read(1), sh(1)
env(1), ioctl(2), ioctl_tty(2), read(1), sh(1)

View File

@ -6,8 +6,9 @@
# include <sysexits.h>
#endif
#include <termios.h> /* tcgetattr(3), tcsetattr(3), struct termios, ECHO */
#include <unistd.h> /* dup(2), execvp(3), fork(2), getopt(3), pipe(2),
* write(2), STDERR_FILENO, STDOUT_FILENO */
#include <unistd.h> /* dup(2), execvp(3), fork(2), getopt(3), isatty(3),
* pipe(2), write(2), STDERR_FILENO, STDIN_FILENO,
* STDOUT_FILENO */
static char *program_name = "peek";
@ -30,7 +31,7 @@ int main(int argc, char *argv[]){
eof = EOF;
include_eof = 0;
while((c = getopt(argc, argv, "1enop")) != -1)
while((c = getopt(argc, argv, "1enopt")) != -1)
switch(c){
case '1': eof = '\n'; break;
case 'n': include_eof = 1; break;
@ -42,6 +43,12 @@ int main(int argc, char *argv[]){
else
outputs[2] = p[1];
break;
case 't':
if(isatty(STDIN_FILENO) != 1){
fprintf(stderr, "%s: Must be run in a terminal"
" (option -t specified)\n", argv[0]);
return EX_USAGE;
}
default: goto usage;
}