[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Why `system` is safer with lists
[Thread Prev] | [Thread Next]
[Date Prev] | [Date Next]
- Subject: Re: Why `system` is safer with lists
- From: mlists@xxxxxxxxx
- Date: Thu, 11 Apr 2024 18:39:00 +0000
- To: jrmu <jrmu@xxxxxxxxxx>
- Cc: codeforce@xxxxxxxxxx
On 4/10/24 22:37, jrmu wrote: > Thanks. > > Can you also submit for me a diff/patch for vpsnow? I'll go ahead and > try to merge it once I get gotwebd back in working order. Alright, there should be a diff attached to this mail. I'd recommend still testing it. I did test it myself, but you never know. Some other notes and nitpicks: - Even with system() or exec() being provided their arguments in list form, you still have to be careful about things like `su -l username -c "..."` for the same reason. I adjusted this script to not need su anymore, but thought I'd mention it. - It would be better to hash the password using Perl if possible, rather than calling encrypt. The problem with calling encrypt and providing the password as an argument is this: anyone that has access to the system, even unprivileged access, can set up a script that watches the process tables. They can use this to grab temporary passwords during your account setup process. - According to `perldoc -tf rand`, rand() is not cryptographically secure and shouldn't be used in security sensitive situations. I noticed you all use it to generate temporary passwords. I thought I'd make a note of it, though I'm not sure how much of an issue this actually is in reality. I think there's likely much lower hanging fruit for attackers to focus on than potential cryptographic flaws in your password generation scheme. - I like to add `use autodie;` to scripts, it makes life easier. Then you no longer have to write `or die "..."` for various things like open. If you're alright with using IPC::System::Simple (a third party module for making system calls), you can do `use autodie qw(:all);` instead, and the autodie pragma will apply to system() and exec() as well. Error handling for IPC in Perl tends to be a pain in my experience, and failing early is safer. I noticed in testing that when I had bad commands, the script would keep running anyway. These are just offhand remarks. Hope that helps. :)
diff /home/user/src/vpsnow
commit - a4f32e6b5c875752bffe3087a8964c833036f167
path + /home/user/src/vpsnow
blob - f3831d91f8f8c401aa62b0f342ce2bd04c8786ea
file + install.pl
--- install.pl
+++ install.pl
@@ -14,13 +14,13 @@ my $ipv4path = "/home/username/ipv4s";
my $isopath = "/home/iso/install73.iso";
my @ipv4s;
if (!(-s "$ipv4path")) {
- print "No IPv4 addresses in $ipv4path!\n";
+ print "No IPv4 addresses in $ipv4path!\n";
die;
} else {
- @ipv4s = readarray($ipv4path);
+ @ipv4s = readarray($ipv4path);
}
-`doas chmod -R g+w $zonedir`;
+system qw(doas chmod -R g+w), $zonedir;
# Read from filename and return array of lines without trailing newlines
sub readarray {
@@ -91,7 +91,7 @@ sub setdns {
# trailing newline necessary
writefile("$filename.bak", join("\n", @lines)."\n");
copy "$filename.bak", $filename;
- if (system("doas -u _nsd nsd-control reload")) {
+ if (system(qw(doas -u _nsd nsd-control reload))) {
return 0;
} else {
return 1;
@@ -115,14 +115,15 @@ sub nextdns {
}
sub createshell {
- my ($username, $password) = @_;
+ my ($username, $password) = @_;
print "Username: $username\n";
print "Password: $password\n";
- system "doas groupadd $username";
- system "doas adduser -batch $username $username $username `encrypt $password`";
- system "doas usermod -G vmdusers $username";
- system "doas chmod -R o-rwx /home/$username";
- system "doas su -l $username -c \"vmctl create -s 20G $username.qcow2\"";
+ chomp(my $hashed_password = `encrypt $password`);
+ system qw(doas groupadd), $username;
+ system qw(doas adduser -batch), $username, $username, $username, $hashed_password;
+ system qw(doas usermod -G vmdusers), $username;
+ system qw(doas chmod -R o-rwx), "/home/$username";
+ system qw(doas -u), $username, qw(vmctl create -s 20G), "/home/$username/$username.qcow2";
print "VM created for $username!\n";
my @vmconf = readarray($vmconf);
my $lladdr;
@@ -147,7 +148,7 @@ vm "$username" {
}
EOF
appendfile($vmconf, $block);
- `doas vmctl reload`;
+ system qw(doas vmctl reload);
}
my $nargs = $#ARGV + 1;
| Why `system` is safer with lists | mlists@xxxxxxxxx |
| Re: Why `system` is safer with lists | jrmu <jrmu@xxxxxxxxxx> |