Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(cli): CLI errors when run as a non-existent user #21018

Merged
merged 4 commits into from
Jul 7, 2022

Conversation

corymhall
Copy link
Contributor

@corymhall corymhall commented Jul 6, 2022

The CDK home directory was being created in the users home directory,
but this causes an error if for some reason the user does not have a
home directory.

This PR adds some fallback logic so that if the users home directory does not exist it will fall back to
creating a tmp directory.

fix #7937


All Submissions:

Adding new Unconventional Dependencies:

  • This PR adds new unconventional dependencies following the process described here

New Features

  • Have you added the new feature to an integration test?
    • Did you use yarn integ to deploy the infrastructure and generate the snapshot (i.e. yarn integ without --dry-run)?

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license

The CDK home directory was being created in the users home directory,
but this causes an error if for some reason the user does not have a
home directory. Since the cdk home directory is only being used to
create a cache directory, this PR updates the location from being the
users home directory to being the os tmp directory.

I don't think there
is a strong reason why this directory needs to live in the users home
directory, but if there is I could also change this to have some
fallback logic instead.

fix #7937
@gitpod-io
Copy link

gitpod-io bot commented Jul 6, 2022

@github-actions github-actions bot added bug This issue is a bug. effort/small Small work item – less than a day of effort p1 labels Jul 6, 2022
@aws-cdk-automation aws-cdk-automation requested a review from a team July 6, 2022 18:50
@mergify mergify bot added the contribution/core This is a PR that came from AWS. label Jul 6, 2022
@corymhall corymhall added the pr-linter/exempt-test The PR linter will not require test changes label Jul 6, 2022
@kylelaker
Copy link
Contributor

There are generally security concerns about having predictable and well-known directories in /tmp. /tmp is world readable and writeable in most cases and hosts may have multiple users. This could result in sharing /tmp/.cdk improperly or perhaps even permissions issues over that particular directory (allowing for a potential accidental DoS?). Even worse, not all users on a host may be friendly. CVEs have been issued to other tools for making similar decisions in the past, such as CVE-2019-3881 or CVE-2020-10870; and in an extreme case not applicable to the CDK today since no cached data seems to be executed, CVE-2020-10174. One could still imagine editing notices.json to insert additional text or improperly gleaning information from account_partitions.json; or even just accidentally having someone else own the file.

This feels like potentially making things harder (or less secure) for the vast majority of users to improve the use case where a user doesn't have a home directory. It may be preferable to use the user's home directory if available and to fallback to a temporary directory. And in that case, it's likely better to use fs.mkdtemp. It'd linger after the fact if not cleaned up but at least it'd be fresh and unpolluted on startup. Something like $XDG_RUNTIME_DIR might be nice too but that's not especially portable outside of a Linux-y environment so mkdtemp may be reasonable.

@corymhall
Copy link
Contributor Author

There are generally security concerns about having predictable and well-known directories in /tmp

I've updated it to have some fallback logic. It will first try and use the home directory and fall back to creating a tmp dir.

Comment on lines +17 to +24
const tmpDir = fs.realpathSync(os.tmpdir());
let home;
try {
home = path.join((os.userInfo().homedir ?? os.homedir()).trim(), '.cdk');
} catch {}
return process.env.CDK_HOME
? path.resolve(process.env.CDK_HOME)
: path.join((os.userInfo().homedir ?? os.homedir()).trim() || '/', '.cdk');
: home || fs.mkdtempSync(path.join(tmpDir, '.cdk')).trim();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why don't we just use the tmpdir proper as the CDK home dir, instead of creating a one-use directory inside it?

if (process.env.CDK_HOME) {
  return path.resolve(process.env.CDK_HOME);
}

let cdkParent;
try {
  cdkParent = os.userInfo().homedir ?? os.homedir();
} catch (e) {
  cdkParent = os.tmpdir();
  debug(`Error retrieving home dir, falling back to temp dir: ${e}`);
}

return path.join(cdkParent, '.cdk');

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I stand corrected, should have read the thread.

@mergify
Copy link
Contributor

mergify bot commented Jul 7, 2022

Thank you for contributing! Your pull request will be updated from main and then merged automatically (do not update manually, and be sure to allow changes to be pushed to your fork).

@aws-cdk-automation
Copy link
Collaborator

AWS CodeBuild CI Report

  • CodeBuild project: AutoBuildv2Project1C6BFA3F-wQm2hXv2jqQv
  • Commit ID: 71fec5b
  • Result: SUCCEEDED
  • Build Logs (available for 30 days)

Powered by github-codebuild-logs, available on the AWS Serverless Application Repository

@mergify mergify bot merged commit e6015a9 into aws:main Jul 7, 2022
@mergify
Copy link
Contributor

mergify bot commented Jul 7, 2022

Thank you for contributing! Your pull request will be updated from main and then merged automatically (do not update manually, and be sure to allow changes to be pushed to your fork).

daschaa pushed a commit to daschaa/aws-cdk that referenced this pull request Jul 9, 2022
The CDK home directory was being created in the users home directory,
but this causes an error if for some reason the user does not have a
home directory.

This PR adds some fallback logic so that if the users home directory does not exist it will fall back to
creating a tmp directory.

fix aws#7937


----

### All Submissions:

* [ ] Have you followed the guidelines in our [Contributing guide?](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md)

### Adding new Unconventional Dependencies:

* [ ] This PR adds new unconventional dependencies following the process described [here](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md/#adding-new-unconventional-dependencies)

### New Features

* [ ] Have you added the new feature to an [integration test](https://github.com/aws/aws-cdk/blob/main/INTEGRATION_TESTS.md)?
	* [ ] Did you use `yarn integ` to deploy the infrastructure and generate the snapshot (i.e. `yarn integ` without `--dry-run`)?

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug This issue is a bug. contribution/core This is a PR that came from AWS. effort/small Small work item – less than a day of effort p1 pr-linter/exempt-test The PR linter will not require test changes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

CDK CLI errors when run as a non-existent user
4 participants