2010-03-26 14:28:14 +00:00
|
|
|
--- a/svr-authpubkey.c
|
|
|
|
+++ b/svr-authpubkey.c
|
2020-06-21 12:36:47 +00:00
|
|
|
@@ -386,14 +386,19 @@ static int checkpubkey(const char* keyal
|
2005-12-13 19:15:43 +00:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2009-04-07 23:04:29 +00:00
|
|
|
- /* we don't need to check pw and pw_dir for validity, since
|
|
|
|
- * its been done in checkpubkeyperms. */
|
|
|
|
- len = strlen(ses.authstate.pw_dir);
|
|
|
|
- /* allocate max required pathname storage,
|
|
|
|
- * = path + "/.ssh/authorized_keys" + '\0' = pathlen + 22 */
|
|
|
|
- filename = m_malloc(len + 22);
|
|
|
|
- snprintf(filename, len + 22, "%s/.ssh/authorized_keys",
|
|
|
|
- ses.authstate.pw_dir);
|
2008-07-24 05:24:52 +00:00
|
|
|
+ if (ses.authstate.pw_uid != 0) {
|
2009-04-07 23:04:29 +00:00
|
|
|
+ /* we don't need to check pw and pw_dir for validity, since
|
|
|
|
+ * its been done in checkpubkeyperms. */
|
|
|
|
+ len = strlen(ses.authstate.pw_dir);
|
|
|
|
+ /* allocate max required pathname storage,
|
|
|
|
+ * = path + "/.ssh/authorized_keys" + '\0' = pathlen + 22 */
|
|
|
|
+ filename = m_malloc(len + 22);
|
2017-05-20 11:54:11 +00:00
|
|
|
+ snprintf(filename, len + 22, "%s/.ssh/authorized_keys",
|
|
|
|
+ ses.authstate.pw_dir);
|
2006-06-09 00:29:26 +00:00
|
|
|
+ } else {
|
2017-05-20 11:54:11 +00:00
|
|
|
+ filename = m_malloc(30);
|
|
|
|
+ strncpy(filename, "/etc/dropbear/authorized_keys", 30);
|
2006-06-09 00:29:26 +00:00
|
|
|
+ }
|
2017-05-20 11:54:11 +00:00
|
|
|
|
2019-03-25 18:40:38 +00:00
|
|
|
#if DROPBEAR_SVR_MULTIUSER
|
2017-05-20 11:54:11 +00:00
|
|
|
/* open the file as the authenticating user. */
|
2020-06-21 12:36:47 +00:00
|
|
|
@@ -474,27 +479,36 @@ static int checkpubkeyperms() {
|
2005-12-13 19:15:43 +00:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2009-04-07 23:04:29 +00:00
|
|
|
- /* allocate max required pathname storage,
|
|
|
|
- * = path + "/.ssh/authorized_keys" + '\0' = pathlen + 22 */
|
2019-03-25 18:40:38 +00:00
|
|
|
- len += 22;
|
|
|
|
- filename = m_malloc(len);
|
|
|
|
- strlcpy(filename, ses.authstate.pw_dir, len);
|
2009-04-07 23:04:29 +00:00
|
|
|
-
|
|
|
|
- /* check ~ */
|
|
|
|
- if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
+ if (ses.authstate.pw_uid == 0) {
|
2006-06-09 00:29:26 +00:00
|
|
|
+ if (checkfileperm("/etc/dropbear") != DROPBEAR_SUCCESS) {
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ if (checkfileperm("/etc/dropbear/authorized_keys") != DROPBEAR_SUCCESS) {
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
2009-04-07 23:04:29 +00:00
|
|
|
+ } else {
|
|
|
|
+ /* allocate max required pathname storage,
|
|
|
|
+ * = path + "/.ssh/authorized_keys" + '\0' = pathlen + 22 */
|
2019-03-25 18:40:38 +00:00
|
|
|
+ len += 22;
|
|
|
|
+ filename = m_malloc(len);
|
|
|
|
+ strlcpy(filename, ses.authstate.pw_dir, len);
|
2009-04-07 23:04:29 +00:00
|
|
|
+
|
|
|
|
+ /* check ~ */
|
|
|
|
+ if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
2019-03-25 18:40:38 +00:00
|
|
|
|
|
|
|
- /* check ~/.ssh */
|
|
|
|
- strlcat(filename, "/.ssh", len);
|
|
|
|
- if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
|
|
|
|
- goto out;
|
|
|
|
- }
|
2009-04-07 23:04:29 +00:00
|
|
|
+ /* check ~/.ssh */
|
2019-03-25 18:40:38 +00:00
|
|
|
+ strlcat(filename, "/.ssh", len);
|
2009-04-07 23:04:29 +00:00
|
|
|
+ if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
2019-03-25 18:40:38 +00:00
|
|
|
|
|
|
|
- /* now check ~/.ssh/authorized_keys */
|
|
|
|
- strlcat(filename, "/authorized_keys", len);
|
|
|
|
- if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
|
|
|
|
- goto out;
|
2009-04-07 23:04:29 +00:00
|
|
|
+ /* now check ~/.ssh/authorized_keys */
|
2019-03-25 18:40:38 +00:00
|
|
|
+ strlcat(filename, "/authorized_keys", len);
|
2009-04-07 23:04:29 +00:00
|
|
|
+ if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
}
|
2006-06-09 00:29:26 +00:00
|
|
|
|
2009-04-07 23:04:29 +00:00
|
|
|
/* file looks ok, return success */
|