diff --git a/lib/spack/spack/schema/packages.py b/lib/spack/spack/schema/packages.py
index 16a8a223efdf4b87d3781bbdfae7796a5d996511..2efe00991a8e420c6b6ed774b0b5cdbf583fd4a7 100644
--- a/lib/spack/spack/schema/packages.py
+++ b/lib/spack/spack/schema/packages.py
@@ -128,6 +128,14 @@ def update(data):
     changed = False
     for cfg_object in data.values():
         externals = []
+
+        # If we don't have these deprecated attributes, continue
+        if not any(x in cfg_object for x in ('paths', 'modules')):
+            continue
+
+        # If we arrive here we need to make some changes i.e.
+        # we need to remove and eventually convert some attributes
+        changed = True
         paths = cfg_object.pop('paths', {})
         for spec, prefix in paths.items():
             externals.append({
@@ -141,6 +149,6 @@ def update(data):
                 'modules': [str(module)]
             })
         if externals:
-            changed = True
             cfg_object['externals'] = externals
+
     return changed
diff --git a/lib/spack/spack/test/cmd/config.py b/lib/spack/spack/test/cmd/config.py
index 97b76dbee148de33a7340409131dd938cce6c2b3..112d88f3425224627c5ca149f86b3ef27cf61301 100644
--- a/lib/spack/spack/test/cmd/config.py
+++ b/lib/spack/spack/test/cmd/config.py
@@ -551,6 +551,27 @@ def test_config_update_can_handle_comments(mutable_config):
     assert '# Another comment after the outdated section' in text
 
 
+@pytest.mark.regression('18050')
+def test_config_update_works_for_empty_paths(mutable_config):
+    # Create an outdated config file with empty "paths" and "modules"
+    scope = spack.config.default_modify_scope()
+    cfg_file = spack.config.config.get_config_filename(scope, 'packages')
+    with open(cfg_file, mode='w') as f:
+        f.write("""
+packages:
+  cmake:
+    paths: {}
+    modules: {}
+    buildable: False
+""")
+
+    # Try to update it, it should not raise errors
+    output = config('update', '-y', 'packages')
+
+    # This ensures that we updated the configuration
+    assert '[backup=' in output
+
+
 def check_update(data):
     """Check that the data from the packages_yaml_v015
     has been updated.