|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 2835 (0xb13)
Types: TextFile
Names: »is_able.pl«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
└─⟦3da311d67⟧ »./cops/1.04/cops_104.tar.Z«
└─⟦6a2577110⟧
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
└─⟦6a2577110⟧ »./cops/1.04/cops_104.tar«
└─⟦this⟧ »cops_104/perl/is_able.pl«
#
# (This takes the place of the C program is_able.c, BTW.)
#
# is_able filename {w|g|s|S} {r|w|B|b|s}
# (world/group/SUID/SGID read/write/{read&write}/{suid&write}/s[ug]id)
#
# The second arg of {r|w} determines whether a file is (group or world
# depending on the first arg of {w|g}) writable/readable, or if it is
# SUID/SGID (first arg, either s or S, respectively), and prints out a
# short message to that effect.
#
# So:
# is_able w w # checks if world writable
# is_able g r # checks if group readable
# is_able s s # checks if SUID
# is_able S b # checks if world writable and SGID
package main;
require 'file_mode.pl';
package is_able;
# package statics
#
%wg = (
'w', 00006,
'g', 00060,
's', 04000,
'S', 02000,
);
%rwb= (
'r', 00044,
'w', 00022,
'B', 00066,
'b', 04022,
's', 06000,
);
$silent = 0; # for suppressing diagnostic messages
sub main'is_able {
local($file, $wg, $rwb) = @_;
local (
$mode, # file mode
$piece, # 1 directory component
@pieces, # all the pieces
@dirs, # all the directories
$p, # punctuation; (*) mean writable
# due to writable parent
$retval, # true if vulnerable
$[ # paranoia
);
&usage, return undef if @_ != 3 || $file eq '';
&usage, return undef unless defined $wg{$wg} && defined $rwb{$rwb};
if (&'Mode($file) eq 'BOGUS' && $noisy) {
warn "is_able: can't stat $file: $!\n";
return undef;
}
$retval = 0;
if ($rwb{$rwb} & $rwb{'w'}) {
@pieces = split(m#/#, $file);
for ($i = 1; $i <= $#pieces; $i++) {
push(@dirs, join('/', @pieces[0..$i]));
}
} else {
@dirs = ( $file );
}
for $piece ( reverse @dirs ) {
next unless $mode = &'Mode($piece);
next if $mode eq 'BOGUS';
next unless $mode &= 07777 & $wg{$wg} & $rwb{$rwb};
$retval = 1;
$p = $piece eq $file ? '!' : '! (*)';
$parent_is_writable = $p eq '! (*)'; # for later
next if $silent; # for &is_writable
print "Warning! $file is group readable$p\n" if $mode & 00040;
print "Warning! $file is _World_ readable$p\n" if $mode & 00004;
print "Warning! $file is group writable$p\n" if $mode & 00020;
print "Warning! $file is _World_ writable$p\n" if $mode & 00002;
print "Warning! $file is SUID!\n" if $mode & 04000;
print "Warning! $file is SGID!\n" if $mode & 02000;
last if $piece ne $file; # only complain on first writable parent
}
$retval;
}
sub main'is_writable {
local($silent) = 1;
&'is_able($_[0], 'w', 'w')
? $parent_is_writable
? "writable (*)"
: "writable"
: 0;
}
sub main'is_readable {
local($silent) = 1;
&'is_able($_[0], 'w', 'r');
}
sub usage {
warn <<EOF;
Usage: is_able file {w|g|S|s} {r|w|B|b|s}
(not: is_able @_)
EOF
}
1;