Skip to content

Commit f9dff1a

Browse files
author
Abhishek Mishra
committed
boards/sim: enable generated passwd for sim:login
Enable build-time /etc/passwd generation in sim:login by setting\nBOARD_ETC_ROMFS_PASSWD_* defaults in the login defconfig.\n\nAdd password validation for build-time generation:\n- reject empty and quoted-empty passwords\n- enforce minimum length of 8 characters\n- preserve special characters when invoking tools/mkpasswd\n\nApply the same minimum-length validation in the CMake ROMFS path\nand in tools/mkpasswd argument validation.\n\nUpdate Kconfig and documentation to describe the required login\nsetting and password constraints. Signed-off-by: Abhishek Mishra <mishra.abhishek2808@gmail.com>
1 parent 38ddd89 commit f9dff1a

9 files changed

Lines changed: 188 additions & 117 deletions

File tree

Documentation/components/tools/index.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ user-supplied plaintext password at build time, each firmware image carries
3131
unique credentials. The build will fail if the password is left empty,
3232
preventing accidental deployments with no credentials.
3333

34+
For improved baseline security, the configured password must be at least
35+
8 characters long.
36+
3437
How it works
3538
~~~~~~~~~~~~
3639

@@ -52,8 +55,9 @@ Enable the feature and configure credentials via ``make menuconfig``:
5255
.. code:: kconfig
5356
5457
CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y
58+
CONFIG_NSH_CONSOLE_LOGIN=y # required to enforce login prompt
5559
CONFIG_BOARD_ETC_ROMFS_PASSWD_USER="admin" # default: admin
56-
CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD="<secret>" # required, build fails if empty
60+
CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD="<secret>" # required, min length 8
5761
CONFIG_BOARD_ETC_ROMFS_PASSWD_UID=0
5862
CONFIG_BOARD_ETC_ROMFS_PASSWD_GID=0
5963
CONFIG_BOARD_ETC_ROMFS_PASSWD_HOME="/"

Documentation/platforms/sim/sim/boards/sim/index.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2015,8 +2015,9 @@ The ``/etc/passwd`` file is auto-generated at build time when
20152015
credentials via ``make menuconfig``:
20162016

20172017
* ``CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y``
2018+
* ``CONFIG_NSH_CONSOLE_LOGIN=y`` (required, otherwise login is not enforced)
20182019
* ``CONFIG_BOARD_ETC_ROMFS_PASSWD_USER`` (default: ``admin``)
2019-
* ``CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD`` (required, build fails if empty)
2020+
* ``CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD`` (required, build fails if empty or shorter than 8 characters)
20202021

20212022
The password is hashed with TEA at build time by the host tool
20222023
``tools/mkpasswd``; the plaintext is **not** stored in the firmware.

boards/Board.mk

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ $(RCOBJS): $(ETCDIR)$(DELIM)%: %
3030
$(Q) mkdir -p $(dir $@)
3131
$(call PREPROCESS, $<, $@)
3232

33-
$(ETCSRC): $(foreach raw,$(RCRAWS), $(if $(wildcard $(BOARD_DIR)$(DELIM)src$(DELIM)$(raw)), $(BOARD_DIR)$(DELIM)src$(DELIM)$(raw), $(if $(wildcard $(BOARD_COMMON_DIR)$(DELIM)$(raw)), $(BOARD_COMMON_DIR)$(DELIM)$(raw), $(BOARD_DIR)$(DELIM)src$(DELIM)$(raw)))) $(RCOBJS)
33+
$(ETCSRC): $(foreach raw,$(RCRAWS), $(if $(wildcard $(BOARD_DIR)$(DELIM)src$(DELIM)$(raw)), $(BOARD_DIR)$(DELIM)src$(DELIM)$(raw), $(if $(wildcard $(BOARD_COMMON_DIR)$(DELIM)$(raw)), $(BOARD_COMMON_DIR)$(DELIM)$(raw), $(BOARD_DIR)$(DELIM)src$(DELIM)$(raw)))) $(RCOBJS) $(TOPDIR)$(DELIM).config $(TOPDIR)$(DELIM)tools$(DELIM)mkpasswd.c
3434
$(foreach raw, $(RCRAWS), \
3535
$(shell rm -rf $(ETCDIR)$(DELIM)$(raw)) \
3636
$(shell mkdir -p $(dir $(ETCDIR)$(DELIM)$(raw))) \
@@ -39,7 +39,11 @@ ifeq ($(CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE),y)
3939
ifeq ($(CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD),)
4040
$(error CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD must be set when BOARD_ETC_ROMFS_PASSWD_ENABLE is enabled. Run 'make menuconfig' to set a password.)
4141
endif
42-
$(Q) if [ ! -f $(TOPDIR)$(DELIM)tools$(DELIM)mkpasswd$(HOSTEXEEXT) ]; then \
42+
ifeq ($(CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD),"")
43+
$(error CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD must be set when BOARD_ETC_ROMFS_PASSWD_ENABLE is enabled. Run 'make menuconfig' to set a password.)
44+
endif
45+
$(Q) if [ ! -f $(TOPDIR)$(DELIM)tools$(DELIM)mkpasswd$(HOSTEXEEXT) ] || \
46+
[ $(TOPDIR)$(DELIM)tools$(DELIM)mkpasswd.c -nt $(TOPDIR)$(DELIM)tools$(DELIM)mkpasswd$(HOSTEXEEXT) ]; then \
4347
$(MAKE) -C $(TOPDIR)$(DELIM)tools -f Makefile.host mkpasswd$(HOSTEXEEXT); \
4448
fi
4549
$(Q) mkdir -p $(ETCDIR)$(DELIM)$(CONFIG_ETC_ROMFSMOUNTPT)
@@ -107,6 +111,17 @@ $(CXXOBJS) $(LINKOBJS): %$(OBJEXT): %.cxx
107111

108112
libboard$(LIBEXT): $(OBJS) $(CXXOBJS)
109113
$(call ARCHIVE, $@, $(OBJS) $(CXXOBJS))
114+
ifeq ($(CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE),y)
115+
ifeq ($(CONFIG_FSUTILS_PASSWD_KEY1),0x12345678)
116+
ifeq ($(CONFIG_FSUTILS_PASSWD_KEY2),0x9abcdef0)
117+
ifeq ($(CONFIG_FSUTILS_PASSWD_KEY3),0x12345678)
118+
ifeq ($(CONFIG_FSUTILS_PASSWD_KEY4),0x9abcdef0)
119+
$(Q) echo ">>>> WARNING: YOU ARE USING DEFAULT PASSWORD KEYS (CONFIG_FSUTILS_PASSWD_KEY1-4)!!! PLEASE CHANGE IT!!! <<<<"
120+
endif
121+
endif
122+
endif
123+
endif
124+
endif
110125

111126
.depend: Makefile $(SRCS) $(CXXSRCS) $(RCSRCS) $(TOPDIR)$(DELIM).config
112127
ifneq ($(ZDSVERSION),)

boards/Kconfig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5457,7 +5457,8 @@ config BOARD_ETC_ROMFS_PASSWD_PASSWORD
54575457
The plaintext password for the auto-generated /etc/passwd entry.
54585458
This value is hashed with TEA at build time; the plaintext is NOT
54595459
stored in the firmware image. The build will fail if this is left
5460-
empty. Set this via 'make menuconfig'.
5460+
empty or shorter than 8 characters. Set this via
5461+
'make menuconfig'.
54615462

54625463
config BOARD_ETC_ROMFS_PASSWD_UID
54635464
int "Admin user ID"

boards/sim/sim/sim/configs/login/defconfig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
66
# modifications.
77
#
8+
# NOTE: CONFIG_FSUTILS_PASSWD_KEY1-4 are intentionally excluded by
9+
# "make savedefconfig" to avoid leaking credentials into mainline.
10+
# CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD is excluded by default,
11+
# except for the sim:login example configuration.
12+
# credentials into mainline. Add them manually in local defconfig if needed.
13+
#
814
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
915
CONFIG_ARCH="sim"
1016
CONFIG_ARCH_BOARD="sim"
@@ -13,6 +19,8 @@ CONFIG_ARCH_CHIP="sim"
1319
CONFIG_ARCH_SIM=y
1420
CONFIG_BOARDCTL_APP_SYMTAB=y
1521
CONFIG_BOARDCTL_POWEROFF=y
22+
CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y
23+
CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD="Administrator"
1624
CONFIG_BOARD_LOOPSPERMSEC=0
1725
CONFIG_BOOT_RUNFROMEXTSRAM=y
1826
CONFIG_BUILTIN=y

cmake/nuttx_add_romfs.cmake

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,14 @@ function(process_all_directory_romfs)
292292
" Run 'make menuconfig' to set a password.")
293293
endif()
294294
295+
string(LENGTH "${CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD}" PASSWD_LEN)
296+
if(PASSWD_LEN LESS 8)
297+
message(
298+
FATAL_ERROR
299+
"CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD must be at least 8 characters."
300+
)
301+
endif()
302+
295303
# Determine host executable suffix (.exe on Windows, empty elsewhere)
296304
if(CMAKE_HOST_WIN32)
297305
set(HOST_EXE_SUFFIX .exe)
@@ -332,6 +340,17 @@ function(process_all_directory_romfs)
332340
list(APPEND MKPASSWD_KEY_ARGS --key4 ${CONFIG_FSUTILS_PASSWD_KEY4})
333341
endif()
334342
343+
if("${CONFIG_FSUTILS_PASSWD_KEY1}" STREQUAL "0x12345678"
344+
AND "${CONFIG_FSUTILS_PASSWD_KEY2}" STREQUAL "0x9abcdef0"
345+
AND "${CONFIG_FSUTILS_PASSWD_KEY3}" STREQUAL "0x12345678"
346+
AND "${CONFIG_FSUTILS_PASSWD_KEY4}" STREQUAL "0x9abcdef0")
347+
set(MKPASSWD_DEFAULT_KEYS_WARNING
348+
">>>> WARNING: YOU ARE USING DEFAULT PASSWORD KEYS (CONFIG_FSUTILS_PASSWD_KEY1-4)!!! PLEASE CHANGE IT!!! <<<<"
349+
)
350+
else()
351+
set(MKPASSWD_DEFAULT_KEYS_WARNING "")
352+
endif()
353+
335354
set(GENPASSWD_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/etc/passwd)
336355
add_custom_command(
337356
OUTPUT ${GENPASSWD_OUTPUT}
@@ -343,7 +362,8 @@ function(process_all_directory_romfs)
343362
${CONFIG_BOARD_ETC_ROMFS_PASSWD_GID} --home
344363
"${CONFIG_BOARD_ETC_ROMFS_PASSWD_HOME}" ${MKPASSWD_KEY_ARGS} -o
345364
${GENPASSWD_OUTPUT}
346-
DEPENDS ${MKPASSWD_BIN}
365+
COMMAND ${CMAKE_COMMAND} -E echo "${MKPASSWD_DEFAULT_KEYS_WARNING}"
366+
DEPENDS ${MKPASSWD_BIN} ${NUTTX_DIR}/.config
347367
COMMENT "Generating /etc/passwd from Kconfig values")
348368
add_custom_target(generate_passwd DEPENDS ${GENPASSWD_OUTPUT})
349369
add_dependencies(generate_passwd build_host_mkpasswd)

cmake/savedefconfig.cmake

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,18 @@ list(SORT LINES)
7272
foreach(LINE IN LISTS LINES)
7373
decode_brackets(LINE)
7474
decode_semicolon(LINE)
75-
file(APPEND ${OUTPUT_FILE} "${LINE}\n")
75+
if(NOT "${LINE}" MATCHES "^CONFIG_FSUTILS_PASSWD_KEY[0-9]"
76+
AND NOT "${LINE}" MATCHES "^CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD=")
77+
file(APPEND ${OUTPUT_FILE} "${LINE}\n")
78+
endif()
7679
endforeach()
7780

81+
message(
82+
WARNING "CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD and"
83+
" CONFIG_FSUTILS_PASSWD_KEY1-4 were intentionally excluded from"
84+
" defconfig by savedefconfig to avoid leaking credentials."
85+
" Add them manually in local defconfig if needed.")
86+
7887
# Converts the newline style for the output file.
7988
configure_file(${OUTPUT_FILE} ${OUTPUT_FILE} @ONLY NEWLINE_STYLE LF)
8089

tools/Unix.mk

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,12 @@ savedefconfig: apps_preconfig
759759
$(Q) ${KCONFIG_ENV} ${KCONFIG_SAVEDEFCONFIG}
760760
$(Q) $(call kconfig_tweak_disable,defconfig.tmp,CONFIG_APPS_DIR)
761761
$(Q) $(call kconfig_tweak_disable,defconfig.tmp,CONFIG_BASE_DEFCONFIG)
762+
$(Q) sed -i -e '/^CONFIG_FSUTILS_PASSWD_KEY[0-9]/d' defconfig.tmp
763+
$(Q) if ! (grep -q '^CONFIG_ARCH_BOARD_SIM=y' .config && \
764+
grep -q '^CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y' .config && \
765+
grep -q '^CONFIG_NSH_MOTD_STRING="MOTD: username=admin password=Administrator"' .config); then \
766+
sed -i -e '/^CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD=/d' defconfig.tmp; \
767+
fi
762768
$(Q) grep "CONFIG_ARCH=" .config >> defconfig.tmp
763769
$(Q) grep "^CONFIG_ARCH_CHIP_" .config >> defconfig.tmp; true
764770
$(Q) grep "CONFIG_ARCH_CHIP=" .config >> defconfig.tmp; true
@@ -774,10 +780,24 @@ savedefconfig: apps_preconfig
774780
$(Q) echo "# You can then do \"make savedefconfig\" to generate a new defconfig file that includes your" >> warning.tmp
775781
$(Q) echo "# modifications." >> warning.tmp
776782
$(Q) echo "#" >> warning.tmp
783+
$(Q) echo "# NOTE: CONFIG_FSUTILS_PASSWD_KEY1-4 are intentionally excluded by" >> warning.tmp
784+
$(Q) echo "# \"make savedefconfig\" to avoid leaking credentials into mainline." >> warning.tmp
785+
$(Q) echo "# CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD is excluded by default," >> warning.tmp
786+
$(Q) echo "# except for the sim:login example configuration." >> warning.tmp
787+
$(Q) echo "# credentials into mainline. Add them manually in local defconfig if needed." >> warning.tmp
788+
$(Q) echo "#" >> warning.tmp
777789
$(Q) cat warning.tmp sortedconfig.tmp > defconfig
778790
$(Q) rm -f warning.tmp
779791
$(Q) rm -f defconfig.tmp
780792
$(Q) rm -f sortedconfig.tmp
793+
$(Q) if ! (grep -q '^CONFIG_ARCH_BOARD_SIM=y' .config && \
794+
grep -q '^CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y' .config && \
795+
grep -q '^CONFIG_NSH_MOTD_STRING="MOTD: username=admin password=Administrator"' .config); then \
796+
echo "WARNING: CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD was not saved in defconfig."; \
797+
echo "WARNING: This is intentional to avoid leaking credentials. Add it manually in local defconfig if needed."; \
798+
fi
799+
$(Q) echo "WARNING: CONFIG_FSUTILS_PASSWD_KEY1-4 were not saved in defconfig."
800+
$(Q) echo "WARNING: This is intentional to avoid leaking credentials. Add them manually in local defconfig if needed."
781801

782802
# export
783803
#

0 commit comments

Comments
 (0)